こんにちは、MockEJB に関する質問があります。EJB を呼び出すコードをテストするために、単体テストを作成する必要があります。Mockito を使用して EJB のモックを作成し、MockEJB を使用して JNDI コンテキストをシミュレートします。
私のテストは次のようになります:
@Test
public void test1() throws Exception {
// create a mock instance
NetworkManager aMockManager = createMockNetworkManager();
// deploy it in mock container and register it in JNDI
registerMockNetworkManager(aMockManager);
// encapsulates the JNDI lookup
NetworkManager manager = NetworkManagerAccessor.getNetworkManager();
// call a method
manager.deleteObject(new TopicId(-1), null, this.userContext);
// verify that the method was called on the mock
verify(aMockManager).deleteObject(new TopicId(-1), null, this.userContext);
}
@Test
public void test2() throws Exception {
// create a mock instance
NetworkManager aMockManager = createMockNetworkManager();
// deploy it in mock container and register it in JNDI
registerMockNetworkManager(aMockManager);
// encapsulates the JNDI lookup
NetworkManager manager = NetworkManagerAccessor.getNetworkManager();
// call a method
manager.deleteDataItem(new DataItemId(-1), null, null, null);
// verify that the method was called on the mock
verify(aMockManager).deleteDataItem(new DataItemId(-1), null, null, null);
}
最初のテストは正常に実行されますが、2 番目のテストは体系的に失敗します (mockito は、期待されるメソッドが呼び出されなかったと言っています)。デバッグ中に、2 回目にモック EJB を JNDI にデプロイしようとすると、デプロイされず、最初のモック オブジェクトはまだそこにあります。したがって、実際には、2 番目のテストは、最初のテストで作成されたモックの JNDI から取得されます。 また、(最初のテストにコメントを付けて) 2 番目のテストを単独で実行すると、正常に実行されることにも注意してください。
私のセットアップとクリーンメソッドは次のようになります:
@Before
public void setupMockJNDI() {
try {
// setup mockEJB
MockContextFactory.setAsInitial();
Context jndiContext = new InitialContext();
// create the mock container
mockContainer = new MockContainer( jndiContext );
} catch (NamingException e) {
e.printStackTrace();
}
}
@After
public void unregisterJNDI() {
// reset mock context
MockContextFactory.revertSetAsInitial();
}
何が起こっているのかよくわかりません。私のテストはモック EJB の例と非常によく似ています。誰にもアイデアはありますか?
ありがとう