我正在使用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());