2012-01-22 3 views
1

JUnit을 사용하여 세션 빈을 테스트하려고하지만 할 수 없습니다. 나는 많은 방법을 시도했지만 여전히 예외가있다. 내가 필요한 것은 다음과 같습니다 :JUnit을 EJB3 및 JPA와 함께 사용하는 방법

  • 테스트 할 필요가있는 Stateless Session Bean이 몇 개 있습니다. 각각 @PersistenceContext이 같으며 EntityManager
  • 을 사용합니다. 테스트 케이스를 통해 테스트 해보아야합니다. 예를 들어, 사용자 이름이 X 인 사용자를 추가 한 다음 동일한 사용자 이름으로 다른 사용자를 추가하려고하면 예외를 catch하고 싶습니다.

누군가 간단하고 간단한 일반 테스트 예를 제공 할 수 있습니까? 나는 이미 많은 것을 읽었지만 항상 오류가 발생합니다 (은 sessionBean.method() (예 : entityManager.find(...))) 또는 Context 또는 기타를 초기화 할 수없는 것과 같은 메서드를 호출 할 때 EntityManager을 얻습니다. PersistenceException).

+0

테스트 케이스 작성 방법은 무엇입니까? Arquillian 또는 OpenEJB와 같은 임베디드 EJB 컨테이너와 같은 통합 프레임 워크를 사용합니까? –

+0

@PiotrNowicki 둘 다 시도했습니다 (프레임 워크로 mockito 사용). 어떻게 설정해야할지, 가져올 필요가 있는지는 모르겠다. 어쨌든 어떤 방법이든 상관 없다. – Simon

+0

간단한 예가 있습니다 : http://stackoverflow.com/questions/6469751/testing-an-ejb-with-junit/20635285#20635285. 내 대답 좀 봐. –

답변

1

나는 Stateless Session Bean을 만들고 테스트 클래스에 Entity Manager을 주입했다. 난 경우 다른 사람의 코드가 필요합니다 게시 :

@Stateless(name = "TestProxy") 
@Remote({TestProxyRemote.class}) 
public class TestProxy implements TestProxyRemote { 

    @PersistenceContext(unitName = "mph") 
    private EntityManager em; 

    @Override 
    public void persist(Object o) { 
     em.persist(o); 
    } 

    @Override 
    public void clear() { 
     em.clear(); 
    } 

    @Override 
    public void merge(Object o) { 
     em.merge(o); 
    } 

    @Override 
    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public Object find(Class classe, String key) { 
     return em.find(classe, key); 
    } 

    @Override 
    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public Object find(Class classe, long key) { 
     return em.find(classe, key); 
    } 

    @SuppressWarnings("rawtypes") 
    @Override 
    public List getEntityList(String query) { 
     Query q = em.createQuery(query); 
     return q.getResultList(); 
    } 

} 



public class MyTest { 

    @BeforeClass 
    public static void setUpBeforeClass() throws NamingException { 
     Properties env = new Properties(); 
     env.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory"); 
     env.setProperty(Context.PROVIDER_URL, "localhost:1099"); 
     env.setProperty("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces"); 
     jndiContext = new InitialContext(env); 
     try { 
      proxy = (TestProxyRemote) jndiContext.lookup("TestProxy/remote"); 
     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

그럼 내가 엔티티의 모든 인스턴스를 검색하는 쿼리를 실행 proxy.getEntityList() O를, 내가 필요로하는 개체를 얻을 수 proxy.find()을 사용할 수 있습니다. 또는 원하는 경우 다른 방법을 추가 할 수 있습니다.

4

당신은 안토니오 Goncalves은 최신 게시물 중 하나에 관심이있을 수 있습니다

그것은 사용의 EntityManager와 테스트 EJB에 대해 알려줍니다

WYTIWYR : What You Test Is What You Run

:

  • Mockito,
  • 포함 된 EJB 컨테이너를 ,
  • Arquillian.
+0

필자는 그것을 읽었으나 조롱당한 엔티티 관리자를 사용하여 세션 빈 (@ DataSourceDefinition'이있는 곳)에 주입했다고 봅니다. 그러나'@ PersistenceContext'를'persistence.xml' 서술자와 함께 사용합니다. 그래서 저는 그의 모범을 내 사건에 어떻게 맞추어야할지 모르겠습니다. – Simon

+0

그는 임베디드 EJB 컨테이너 나 Arquillian이 사용되지 않을 때만 EntityManager를 조롱합니다. 다른 경우에는 컨테이너에 의해 주입 된 실제 EntityManager를 사용합니다. –

0

Unitils는 JPA에 대한 정말 멋진 지원을 제공합니다. Unitils는 JUnit 또는 TestNG와 함께 사용할 수 있으며 조롱 프레임 워크가 필요한 경우 Unitiles는 EasyMock을 지원할뿐 아니라 자체 조롱 모듈을 제공합니다.

@JpaEntityManagerFactory(persistenceUnit = "testPersistenceUnit") 
    @DataSet(loadStrategy = RefreshLoadStrategy.class) 
    public class TimeTrackerTest extends UnitilsTestNG { 

     @TestedObject 
     private TimeTrackerBean cut = new TimeTrackerBean(); 

     @InjectInto(target="cut",property="em") 
     @PersistenceContext 
     private EntityManager em; 

     @Test 
     @DataSet("TimeTrackerTest.testAddTimeSlot.xml") 
     public void yourTest() { 
      ... 
     } 
    } 

@JpaEntityManagerFactory - 지속성 단위를 지정하는 데 사용됩니다. 프로젝트 클래스 경로에서 persistence.xml을 자동으로 선택합니다. @DataSet - 테스트 데이터를로드해야 할 경우를 대비하여 사용할 수 있습니다. @TestedObject - 테스트중인 클래스를 표시합니다. @PersistenceContext - persistence.xml - PersistenceUnit의 구성으로 EntityManager 인스턴스를 자동으로 만듭니다. @InjectInto - em 인스턴스를 대상에 삽입합니다 (잘라 내기)

자세한 내용은 this을 참조하십시오.

희망이 도움이됩니다.

0

나는 이것을 위해 Needle을 사용하고 있습니다. 다른 객체를 모의하려는 경우 Mockito 및 EasyMock과 잘 작동합니다.

먼저 나는 persistencte를 씁니다.시험이 같은 (SRC/테스트/자원/META-INF)에 대한 XML : 내이 JUnit의 TestClass에서

<persistence-unit name="rapPersistenceTest" transaction-type="RESOURCE_LOCAL"> 
    <properties> 
    <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> 
    <property name="javax.persistence.jdbc.url" value="jdbc:h2:~/test"/> 
    ... 
    </properties> 
</persistence-unit> 

나는 쓰기 :

public class DaoNeedleTest { 

//here Needle will create persistenceContext for your testclass 
public static DatabaseRule databaseRule = new DatabaseRule("rapPersistenceTest"); 

//here you can get the entityManager to manipulate data directly 
private final EntityManager entityManager = databaseRule.getEntityManager(); 

@Rule 
public NeedleRule needleRule = new NeedleRule(databaseRule); 

//here you can instantiate your daoService 
@ObjectUnderTest 
DAOService daoService; 

@Test 
public void test() { 
    //if your method needs a transaction here you can get it 
    entityManager.getTransaction().begin(); 

    daoService.yourMethod();   

    entityManager.getTransaction().commit(); 
} 

또한/SRC에서 바늘 구성 파일이 필요합니다 테스트/리소스, 당신이 어떤 종류의 모의 - 제공자를 사용하고 있는지 알려줍니다. 예 : 나는 Mockito를 사용하고 있습니다.

mock.provider=de.akquinet.jbosscc.needle.mock.MockitoProvider 

그래, 맞아.

관련 문제