2012-01-22 17 views
1

セッションBeanをJUnitでテストしようとしていますが、できません。私は多くの方法を試しましたが、まだいくつかの例外があります。 ここに私が必要としているものがあります:EJB3とJPAでJUnitを使用する方法

  • 私はテストする必要があるいくつかのステートレスセッションビーンがあります。それぞれが同じを持ち、EntityManager
  • 私のテストケースでは、そのメソッドをテストする必要があります。たとえば、ユーザー名がXのユーザーを追加して、同じユーザー名で別のユーザーを追加しようとすると、例外をキャッチしたいと考えています。

誰かが簡単で短い一般テストの例を提供できますか?私はすでに多くを読んだことがありますが、私はいつもエラーが発生します(はsessionBean.method()などのメソッドを呼び出すとEntityManagerになります)、またはContextなどの初期化ができません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

あなたはアントニオ・ゴンサルヴェスの最新記事の一つに興味があるかもしれない:

WYTIWYR : What You Test Is What You Run

それは使用してEntityManagerを使用したテストのEJBについて伝えます:

  • Mockito、
  • 組み込みEJBコンテナを、
  • Arquillian。
+0

私はそれを読んでいますが、彼は虚偽のエンティティマネージャを使って、セッションBean( '@ 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を書きます。私が書く私の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> 

:このようなテストのためのXML(SRC /テスト/リソース/ META-INF)

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の中に針の構成ファイルを必要としますあなたが使っているMock-providerの種類を教えてください。例えば。私はMockitoを使用しています:

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

これはそれです。

関連する問題