どのようにユニットテストEJBへJPA2を使用しているとき?
-
26-09-2019 - |
質問
どのようにJPAを使用してEJBをテストユニットに行きますか?私は(以下に定義)注文の合計を計算することになっているOrderエンティティととは、OrderEJBを持っている場合たとえば、どのように私は、データベースを触れることなくEJBのテストユニットに行きますか?また、あなたはあなたのエンティティの値を定義する方法を、あなたが期待される計算を主張することができますか?ここでは...
以下のいくつかのサンプルコードがあります@Entity
public class Order {
@Id
private long OrderId;
private LineItem[] items;
}
とは、OrderEJB
@Stateless
public class OrderEJB {
EntityManager em;
public double calculateOrderTotal(long orderId) { .. }
}
私はデータベースに触れることができない場合は、はどのようにcalculateOrderTotalメソッドをテストするユニットに行きますか?私はそのアプローチから脱却しようとしているので、私はDAOを実装する必要はありません。
任意の助けてくれてありがとう。
解決
(私たちは、注釈を無視した場合)は、OrderEJBと秩序とのLineItemであることを一般論だけでPOJOではないので、スタンドアロンのJUnitでテストすることができますか?私たちは、EntityManagerを模擬する必要があり、おそらく
でます calculateOrderTotal()
あなたはコンセプトの
行くことをいくつかのコードを持っています em.giveMeThisOrder(orderId)
あなたはこれを嘲笑。あなたがテストしているにbusinesssロジックは、次にどのようなモックリターンによって駆動されます。これにキーを使用すると、たとえば、JMockのために、良いのモックフレームワークを使用しなければならないということです。任意のテストでは、(obviuslyないこの構文で)言ってます:
EntitiyManager mockEm = // create the mock
mockEm.check(that you are called with and order Id of 73)
mockEm.please( when someone calls giveMeThisOrder return then **this** particular order)
など、各テストであなたがあなたのcalcualtionコードのいくつかの側面を行使するために必要な正確に順序を作成します。あなたも、あなたの計算のすべてのエッジやコーナーケースをプッシュする多くのそのようなテストを持っていることがあります。
ここで重要な考え方は、ユニットテストは、データベースなどの外部依存関係がないことを意味しています。統合テストは、実際のデータベースを使用することができます。それはかなり鈍いことができ、それらの注文インスタンスを作成し、右のあなたのモックを取得する手間をすることができますが、それは未来がはるかに迅速にテストする傾向があるんます。
私も早く統合テストをやって好むん - 。あなたの道というエラーの全体の他のクラスを見つける
他のヒント
あなたはのOpenEJBを試してみていましたか? - 組み込みモードでは、あなたの場合、セットアップすることができます日食からかなりの実行ユニットテスト。私は前にユニットテストのためのエンティティマネージャの注射などを嘲笑しているけど、それは退屈な取得します。 OpenEJBのを使用すると、以下の設定でそれを行うことができます。 http://openejb.apache.org/する
ここで私は何をすべきかです。
まず、あなたのテストのためのインメモリデータベースを設定する必要があります。それはちょうど、通常のデータベースのように動作しますが、それはディスク上に格納されていません。ダービーとHSQLDBの両方がこれをサポートします。
はあなたのユニットテストでは、手動でEntityManagerを作成し、自分のEJBインスタンスにそれを注入します。あなたはおそらく、あなたがトランザクションを管理できるように、このように、EntityManagerのへの参照を保持する必要があります:
em.getTransaction().begin();
myEjb.doSomething(x, y);
em.getTransaction().commit();