我正在试图理解JMockit,但我仍然遇到了墙。
这是我要测试的课程:
@Stateless
public class VerfahrensArchivService {
@PersistenceContext
private EntityManager em;
public void storeAndUpdateVerfahren(List<Verfahren> pVerfahrenToStore) {
if (pVerfahrenToStore == null){
throw new IllegalArgumentException("pVerfahrenToStore darf nicht null sein!");
}
for (Verfahren verfahren : pVerfahrenToStore) {
Verfahren storedCopy = getVerfahrenByExterneID(verfahren.getFremdsystem(), verfahren.getExterneId());
if (storedCopy == null){
//Ein neues Verfahren wurde gefunden!
em.persist(verfahren);
}else{
}
}
}
}
这就是我的测试结果:
public class VerfahrensArchivServiceTest {
@Tested
private VerfahrensArchivService archiveService;
@NonStrict //Also tried simple @Mocked
private EntityManager em;
@Test
public void should_store_new_verfahren_to_persistence_layer(){
List<Verfahren> listeMitEinemNeuenVerfahren = new ArrayList<Verfahren>();
Verfahren v = new Verfahren();
v.setId(0);
v.setExterneId("Neu");
v.setFremdsystem(Verfahren.FREMDSYSTEM_P);
listeMitEinemNeuenVerfahren.add(v);
new NonStrictExpectations(archiveService) {
{
//simulate that nothing was found in the db
archiveService.getVerfahrenByExterneID(anyString, anyString);result = null;
}
};
new Expectations() {
{
em.persist(any);
}
};
archiveService.storeAndUpdateVerfahren(listeMitEinemNeuenVerfahren);
}
}
测试失败,因为在调用em.persist()时EntityManager为null。 为什么? 测试结构是否正确?如果没有,你能告诉我我的表现如何更好吗?
我真的相信JMockit会帮助我以TDD的方式提高效率。但我需要了解如何正确使用它。
答案 0 :(得分:2)
我更仔细地阅读了@Tested Javadoc。它说,你可以使用测试方法参数来设置被测试的@Tested /类。只需声明所需类型的@Incectable参数即可。阅读@Tested javadoc,了解params如何与未初始化的字段匹配。
所以,我的测试适用于此:
@Test
public void should_store_new_verfahren_to_persistence_layer(@Injectable final EntityManager em){
List<Verfahren> listeMitEinemNeuenVerfahren = new ArrayList<Verfahren>();
Verfahren v = new Verfahren();
v.setId(0);
v.setExterneId("Neu");
v.setFremdsystem(Verfahren.FREMDSYSTEM_P);
listeMitEinemNeuenVerfahren.add(v);
new NonStrictExpectations(archiveService) {
{
archiveService.getVerfahrenByExterneID(anyString, anyString);result = null;
}
};
new Expectations() {
{
em.persist(any);
}
};
archiveService.storeAndUpdateVerfahren(listeMitEinemNeuenVerfahren);
}