2011-10-14 6 views
7

私はEJB 3.1のユニットテストについて少し研究しています。最後に私の目標は、Unit Testing EJB 3.1の使いやすいソリューションを作成することです。ユニットテストEJB 3.1

  1. 私は大規模なEJB実装について多くの知識を持っていないため、経験豊富なユーザー(あなた)が単体テストEJBで困難なことをあなたのアイデアにまとめてみたいと思います。
  2. 初期の調査では、組み込みコンテナを使用するのではなく、単体テストのために模擬フレームワークを使用する利点を理解できます。どちらも良いですが、単体テストの場合、フレームを嘲笑することはやや上です。埋め込まれたコンテナは非常に良いコースであり、独自の利点を持っていますが、単体テストとは異なるフェーズになる可能性があります。私はまだ改善することができるそのようなフレームワークを使用するいくつかのシナリオでは少なくともいくつかの不足があるはずだと考えています。

これまでにこのフォーラムで共有できる単体テストEJBの完全なソリューションを作りたいと思っています。

ご協力いただきありがとうございます。

答えて

14

あなたのアドバイスは、私が見ている共通のトラップに陥らないようにすることです。これは、モックと組み込みのEJBコンテナの使用を選択する必要があると考えることです。

両方を使用することができます。両方を使用する必要があります。両方を使用するのが難しい場合は、EJBコンテナのより優れたサポートとより多くの機能を要求する必要があります。

もちろん、OpenEJBの人々は本当に支持的で、両方の世界のベストを得るための機能を追加することができます。ほぼすべての本当に良い機能は、ユーザーが非常に具体的なことをしようとしていることを求めて、難しいと感じるという要求の周りに作成されています。

標準EJBContainerのAPI

package org.superbiz.stateless.basic; 

import junit.framework.TestCase; 

import javax.ejb.embeddable.EJBContainer; 

public class CalculatorTest extends TestCase { 

    private CalculatorBean calculator; 

    /** 
    * Bootstrap the Embedded EJB Container 
    * 
    * @throws Exception 
    */ 
    protected void setUp() throws Exception { 

     EJBContainer ejbContainer = EJBContainer.createEJBContainer(); 

     Object object = ejbContainer.getContext().lookup("java:global/simple-stateless/CalculatorBean"); 

     assertTrue(object instanceof CalculatorBean); 

     calculator = (CalculatorBean) object; 
    } 

完全なソースhere

これはクラスパスをスキャンし、すべてのBeanをロードします。あなたは、コードのすべてを定義する

無スキャン、簡単にモックアプローチ

若干異なるアプローチ。明らかに、必要に応じて必要に応じて豆のモック実装を提供できるので、嘲笑はより簡単です。

@RunWith(ApplicationComposer.class) 
public class MoviesTest extends TestCase { 

    @EJB 
    private Movies movies; 

    @Resource 
    private UserTransaction userTransaction; 

    @PersistenceContext 
    private EntityManager entityManager; 

    @Module 
    public PersistenceUnit persistence() { 
     PersistenceUnit unit = new PersistenceUnit("movie-unit"); 
     unit.setJtaDataSource("movieDatabase"); 
     unit.setNonJtaDataSource("movieDatabaseUnmanaged"); 
     unit.getClazz().add(Movie.class.getName()); 
     unit.setProperty("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)"); 
     return unit; 
    } 

    @Module 
    public EjbJar beans() { 
     EjbJar ejbJar = new EjbJar("movie-beans"); 
     ejbJar.addEnterpriseBean(new StatefulBean(MoviesImpl.class)); 
     return ejbJar; 
    } 

    @Configuration 
    public Properties config() throws Exception { 
     Properties p = new Properties(); 
     p.put("movieDatabase", "new://Resource?type=DataSource"); 
     p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver"); 
     p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb"); 
     return p; 
    } 

    @Test 
    public void test() throws Exception { 

     userTransaction.begin(); 

     try { 
      entityManager.persist(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992)); 
      entityManager.persist(new Movie("Joel Coen", "Fargo", 1996)); 
      entityManager.persist(new Movie("Joel Coen", "The Big Lebowski", 1998)); 

      List<Movie> list = movies.getMovies(); 
      assertEquals("List.size()", 3, list.size()); 

      for (Movie movie : list) { 
       movies.deleteMovie(movie); 
      } 

      assertEquals("Movies.getMovies()", 0, movies.getMovies().size()); 

     } finally { 
      userTransaction.commit(); 
     } 
    } 
} 

Full source here

最終結果

それは、テストの異なるタイプの違いに焦点を当てることは魅力的だなど確かに実用的なミドルのために言うことに何かがあります。私は個人的には、「ユニット」と「統合」のスタイルをできるだけ流暢に混ぜることができないということは間違っていません。

確かに、それは素晴らしい目標です。私たちをより近づけるためのアイデアや機能要求は大歓迎です。

+0

こんにちはデビッド、お返事をありがとうたくさん。私は両方のアプローチをミックスすることも考えていました。どちらのアプローチも、両方のアプローチの利点を収穫するのに役立ちます。 – Bala

5

あなたは(排他的ではない)を検討する必要がありますテストの実際には二つの異なるタイプがあります。

  • ユニットテスト:あなたのEJBは一日の終わりのPOJOであるため、あなたの優先を使用することができますユニットテストフレームワーク(JUnitなど)、またMockitoやEasyMockのような模擬フレームワークなどがあります。
  • インテグレーションテスト:ここでは、EJBがコンテナ内にあるかのように(分離されていない)テストしたいので、そのコンテナを何らかの形でエミュレートする必要があります。単体テストフレームワークを使用してテスト(JUnitなど)をコーディングすることはできますが、これらのEJBがコンテナ内でどのように動作し、他の共同作業者(他のEJBなど)と対話するかをテストしています。これは私がお勧めしますArquillian
+0

入力いただきありがとうございます。基本的に、単体テストをより簡単にし、開発者にとってエレガントで簡単な機能にすることに焦点を当てています。しかし、言及したように、より良いアプローチは、UTと組み込みコンテナを使用した統合テストの両方を組み合わせたものであり、UTの2つのフェーズはすばらしいアプローチのようです。 – Bala

3

Java EEコンポーネントの単体テストにはニードルを使用できます。

ニードルは、コンテナの外部でJava EEコンポーネントを単独でテストするための軽量フレームワークです。これは、モックオブジェクトの依存性と自動注入を分析することによって、テスト設定コードを減らします。

http://needle.spree.de

関連する問題