DAO简直就是:
@PersistenceContext
private EntityManager em;
@Override
public List<TestModel> findAll() {
return em.createNamedQuery("TestModel.findAll").getResultList();
}
,测试是:
@Mock
private EntityManager em;
@InjectMocks
@Autowired
private TestModelDao dao = new TestModelDaoImpl();
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(dao);
}
,模拟测试是:
@Test
public void testFindAll() {
when(dao.findAll()).thenReturn(testModelList());
List<TestModel> testModels = dao.findAll();
assertThat(testModels, is(testModelList()));
}
但上面的测试会抛出NullPointerException
。我做错了什么?
答案 0 :(得分:0)
当调用方法createNamedQuery时,Mockito返回null,因此在getResultList上得到NullpointerException。
你必须
TypedQuery mockedQuery = mock(TypedQuery.class);
when(em.createNamedQuery(eq("TestModel.findAll")).thenReturn(mockedQuery);
when(mockedQuery.getResultList()).thenReturn(testModelList());
但是像JB Nizet所说,你正在测试已经由jpa提供商测试过的EntityManager。
我建议您使用dbunit和内存数据库创建集成测试,以测试您的dao。