数据无法从数据库获取 - mockito



我正在使用Mockito框架进行jUnit测试。我无法从数据库中获取数据。从数据库中获取null或空。不知道我该如何嘲笑entityManager。

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();
         }
         //......   
   }

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

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

为了测试这个类不能模拟它。使用new AppDataService()创建它,或者让mockito为您做这件事(@InjectMocks

要初始化mock或测试中的类,可以通过使用注释来完成,也可以使用mockito runner:

@RunWith(MockitoJunitRunner.class)
public class AppServiceTest  {
   @InjectMock
   private AppService appService;
   @Mock
   private EntityManager entityManager;

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

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

如果您希望createQuery("myQuery")调用返回一些东西,那么您应该在setup方法中的mock创建/注入之后正确地存根它。

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

如果mock返回什么并不重要,只要它不是null,那么可以使用初始化mock

@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()); 

如果你想测试appDataService,你不需要模拟它。这个字段应该用@InjectMocks来注释。

@InjectMocks
private AppDataService appDataService = new AppDataService();

需要模拟的是entityManager.createQueryquery.getResultList方法。

Query queryMock = mock(Query.class);
when(entityManager.createQuery(anyString())).thenReturn(queryMock);
when(query.getResultList()).thenReturn(customResults);

之后,您可以在测试中调用appDataService.getAllDc()并检查结果。

相关内容

  • 没有找到相关文章