Инициализирует ли JMockit EJBs?
Я пытаюсь понять 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);
}
}
Тест не выполняется, так как EntityManager имеет значение null в момент вызова em.настаивать(). Почему? Правильно ли структурирован тест? Если нет, то не могли бы вы показать мне, как я лучше справляюсь?
Я действительно верю, что JMockit поможет мне быть более продуктивным в TDD. Но мне нужно понять, как им пользоваться. правильно.
1 ответ:
Я прочитал @Tested Javadoc немного более внимательно. Там говорится,что вы можете использовать параметры метода тестирования для настройки тестируемого класса @Tested/. Просто объявите параметр @Incectable нужного вам типа. Читать @проверенных 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); }