2

SessionContextをリソースとしてEJBに注入しています(コンテナー管理トランザクションを実装しています):

@Stateless(name = "XXX", mappedName = "PPP-MMM-CCC")
@TransactionManagement(value=TransactionManagementType.CONTAINER)
public class Xxx implements ItsRemoteInterface {
   @Resource
   private SessionContext sctx;
   ....
}

実行中の「sctx」がnullであるため、ユニットテストが失敗します(NullPointerException)。したがって、これを修正するために私が考えた唯一の方法は、SessionContextを実装するFakeSessionContextクラスを作成することです。これは、テスト中に使用できます。

instance = new Xxx();
sessionContextResourceField = Xxx.class.getDeclaredField("sctx");
sessionContextResourceField.setAccessible(true);
sessionContextResourceField.set(instance, new FakeInitialContext());

しかし、それをする前に、もっとエレガントな方法があるのだろうかと思っていました。FakeSessionContextクラスを作成する以外に?ファクトリクラスのようなものですか?

興味のある方のために、私はjUnit4.10とjmockit0.999.15を使用しています。

4

2 に答える 2

1

jmockitを使用してセッションコンテキストのモックバージョンを作成し、jmockitのバージョンの「when ... return」ステートメントを使用して、モックコンテキストが必要な値を返すようにします。

于 2013-03-26T08:28:11.253 に答える
0

他の人の利益のために、これはjmockitで行われる方法です:

sessionContextResourceField.set(instance, 
            new MockUp<SessionContext>() {
                @Mock boolean getRollbackOnly() { return false; }
            }.getMockInstance());

私の場合、getRollbackOnly(コードで使用)をモックする必要はありませんでしたが、将来の動作が変更された場合に備えて、とにかくモックしました。

于 2013-03-26T18:21:22.790 に答える