我正在使用Mockito框架进行jUnit测试。
我无法从数据库中获取数据。从数据库获取null或为空。不知道如何模拟实体管理器。

public class AppServiceTest  {

    @Mock
    private EntityManager entityManager;
    @Mock
    DataSource mockDataSource;
    @Mock
    Connection mockConn;
    @Mock
    PreparedStatement mockPreparedStmnt;
    @Mock
    ResultSet mockResultSet;
    @Mock
    private Query query;

    @Test
    public void testGetAllDc() throws NamingException {

        AppDataService appDataService  = Mockito.mock(AppDataService.class);
        List<String> customResults = new ArrayList<String>();
        //customResults = ....
        System.out.println("**RESULTS**"+appDataService.getAllDc());              // here it is printed as []
        Mockito.when(appDataService.getAllDc()).thenReturn(customResults);
        }
    }


AppDataService.java:

@Stateless
public class AppDataService{

   @PersistenceContext
   EntityManager entityManager;

     public List<Object> getAllDc() {
       try {
         Query query = entityManager.createQuery("myQuery");
         List<String> allDc= query.getResultList();
         }
         //......
   }


更新:
它观察到可以将的实体管理器的模拟值检测为Mock for EntityManager, hashCode: 5425710。但是entityManager.getCriteriaBuilder()或任何entityManager.get....()在AppDataService类中都为null。

最佳答案

在测试中,创建一个模拟AppDataService appDataService = Mockito.mock(AppDataService.class);

为了测试该类,您不能模拟它。使用new AppDataService()创建它,或让模仿者为您完成(@InjectMocks

要初始化模拟或被测类,您可以使用批注来执行此操作,也可以使用模仿者运行器:

@RunWith(MockitoJunitRunner.class)
public class AppServiceTest  {

   @InjectMock
   private AppService appService;

   @Mock
   private EntityManager entityManager;


要么

@Before
public void setup() {
  MockitoAnnotations.initMocks(this);
}


此外,您嘲笑了entitymanager,因此它的所有方法都是存根的,并且在任何方法调用上默认都不返回任何值(空)。

如果希望createQuery("myQuery")调用返回某些内容,则应在setup方法中进行模拟创建/注入后将其正确存根。

@Before
public void setup() {
  //...
  when(entityManager.createQuery(eq("myQuery"))).thenReturn(query);
  //OR
  when(entityManager.createQuery(anyString())).thenReturn(query)


如果只要不为null,则返回的模拟值无关紧要,您可以使用

@Mock(answer = Answers.RETURNS_DEEP_STUBS)) //OR @Mock(answer = Answers.RETURNS_MOCKS)
private EntityManager entityManager;


所以整个测试应该看起来像

@RunWith(MockitoJunitRunner.class)
public class AppServiceTest  {

  @Mock(answer = Answers.RETURNS_DEEP_STUBS))
  private EntityManager entityManager;
  @Mock
  private Query query;

  ...
  @InjectMocks
  private AppDataService appDataService;

  @Test
  public void testGetAllDc() throws NamingException {

     //arrange
     List<String> customResults = new ArrayList<String>();
     //TODO populate customResults
     when(entityManager.createQuery("myQuery")).thenReturn(query);
     when(query.getResultList()).thenReturn(customResults);

     //act
     System.out.println("**RESULTS**"+appDataService.getAllDc());

09-30 22:54