3

JUnit で EJBContainer を使用して EJB をテストしています。テストされた Bean によって呼び出された別の EJB は、Bean を使用したテストによってモックされ@alternativeます。このモック Bean は次のように構成さ<alternative>れます。beans.xml

すべてがチャームのように機能し、EJB はテストされ、モックされたサービスを使用します。

質問: beans.xml を使用する代わりに、コードだけで同じことを行うことは可能ですか?

もちろん、abeans.xmlは優れた柔軟性を提供しますが@alternative、同じ Bean に対して別のものを使用したい場合や、同じプロジェクト内の単一/他のテストに固有のものを選択する可能性がある場合があります。おそらく、別の解決策はbeans.xml特定のテストに固有のものになるでしょうか(それを選択する方法についての質問があります)?

テスト コードの一部 (ExtensionMock は、テスト済みの EchoRemote 実装とテストの一部によって呼び出されます):

public class EchoTest {
private EJBContainer ejbContainer;
private Context ctx;


@Before
public void setUp() throws NamingException {
    ejbContainer = EJBContainer.createEJBContainer();
    ctx = ejbContainer.getContext();
}

@After
public void tearDown() {
    ejbContainer.close();
}

@Test
public void testFindAll() {
    try {
        EchoRemote userEJB = (EchoRemote) ctx.lookup("java:global/ssb-ejb/Echo!examples.ssb.EchoRemote");
        assertNotNull(userEJB);
        assertEquals("Hello World", userEJB.echo("Hello World"));
    } catch (NamingException e) {
        throw new AssertionError(e);
    }
}

}

<beans>

    <alternatives>
        <class>examples.ssb.EchoExtensionMock</class>
    </alternatives>

</beans>
4

3 に答える 3

3

独立した @Alternative 実装を作成する代わりに、既存のものを拡張して @Specializes で注釈を付けることができます。

参照: http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Specializes.html

于 2013-12-18T07:31:46.083 に答える
1

beans.xml代替セクションは空のままにします。テストクラスにアノテーションを付ける

@RunWith(org.jglue.cdiunit.CdiRunner.class)
@org.jglue.cdiunit.ActivatedAlternatives(EchoExtensionMock.class)
public class MyTest {
...

または、同じランナーでクラスに注釈を付けて、別のモックを生成することもできます。

@RunWith(org.jglue.cdiunit.CdiRunner.class)
public class MyTest {

  @Produces
  @org.jglue.cdiunit.ProducesAlternative
  @org.mockito.Mock
  private EchoExtensionMock echoExtension;

  @Inject
  private EchoRemote echoRemote;

  @Test
  public void test() throws Exception {
    Mockito.when(echoExtension.someMethod()).thenReturn(new Object());

    // here comes the testing code
  }
于 2013-08-21T16:07:19.520 に答える
1

拡張機能でこれを行うことができるかもしれませんが、試したことはありません。

于 2013-08-19T22:58:13.693 に答える