我想了解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方式帮助我提高生产力。但是我需要了解如何正确使用它。

最佳答案

我更仔细地阅读了@Tested Javadoc。它指出,您可以使用测试方法参数来设置被测试的@ Tested / class。只需声明所需类型的@Incectable参数即可。阅读@Tested javadoc,以了解参数如何与未初始化的字段匹配。

因此,我的测试适用于此:

@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);

}

关于java - JMockit是否初始化EJB?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18034584/

10-10 17:59