模拟返回列表的DAO会抛出NPE

时间:2015-09-12 10:29:47

标签: java unit-testing jpa junit mockito

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。我做错了什么?

1 个答案:

答案 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。