我正在使用Mockito框架进行jUnit测试。 我无法从数据库中获取数据。从db中获取null或empty。不知道如何模拟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。
答案 0 :(得分:2)
在测试中,您创建了一个模拟map.fitBounds(bounds);
。
为了测试此课程,您一定不能嘲笑它。可以使用AppDataService appDataService = Mockito.mock(AppDataService.class);
创建它,也可以让mockito为您执行此操作(new AppDataService()
)
要初始化模拟或被测试类,您可以使用注释并使用mockito runner来执行此操作:
@InjectMocks
或
@RunWith(MockitoJunitRunner.class)
public class AppServiceTest {
@InjectMock
private AppService appService;
@Mock
private EntityManager entityManager;
此外,您模拟了entitymanager,因此它的所有方法都是存根的,并且在任何方法调用中默认情况下都不返回任何值(null)。
如果您期望@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
调用返回某些内容,则应在设置方法中模拟创建/注入后正确存根。
createQuery("myQuery")
如果模拟返回的内容并不重要,只要它不为空,你可以使用
来初始化模拟。@Before
public void setup() {
//...
when(entityManager.createQuery(eq("myQuery"))).thenReturn(query);
//OR
when(entityManager.createQuery(anyString())).thenReturn(query)
所以整个测试看起来应该是
@Mock(answer = Answers.RETURNS_DEEP_STUBS)) //OR @Mock(answer = Answers.RETURNS_MOCKS)
private EntityManager entityManager;
答案 1 :(得分:1)
如果要测试它,则无需模拟appDataService
。该字段应使用@InjectMocks
进行注释。
@InjectMocks
private AppDataService appDataService = new AppDataService();
您需要模拟的是entityManager.createQuery
和query.getResultList
方法。
Query queryMock = mock(Query.class);
when(entityManager.createQuery(anyString())).thenReturn(queryMock);
when(query.getResultList()).thenReturn(customResults);
之后,您可以在测试中致电appDataService.getAllDc()
并检查结果。