2013-08-03 33 views
2

我正试图理解JMockit,但仍然遇到墙壁。JMockit是否初始化EJB?

这是一类我想测试:

@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{ 

     } 

    } 

} 
} 

这是我的测试看起来像:因为EntityManager的是在调用em.persist的瞬间空

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

} 



} 

测试失败()。 为什么? 测试结构是否正确?如果没有,你能告诉我我的表现如何更好吗?

我真的相信JMockit能够帮助我以TDD的方式提高生产力。但我需要了解如何正确使用它。

回答

2

我更仔细地阅读了@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); 

} 
+0

BTW:1年后我切换到的Mockito。它使用起来非常容易。它不允许使用错误的代码。 JMockit非常费解。 ;) – KFleischer