2013-08-19 64 views
3

我們正在JUnit中用EJBContainer測試一個EJB。由測試bean調用的另一個EJB被測試用一個@alternative bean模擬。這個模擬豆被配置爲<alternative> in beans.xml用代碼注入@alternative bean,而不是beans.xml

一切工作就像一個魅力,EJB被測試並使用模擬服務。

問題:是否可以僅使用代碼執行相同的操作,而不使用beans.xml?

當然,beans.xml具有很好的靈活性,儘管有時候人們可能想要爲同一個bean有不同的@alternative,並且有可能在同一個項目中爲單個/其他測試選擇一個特定的測試。也許另一個解決方案將是特定的beans.xml某些測試(問題如何選擇它)?

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> 

回答

1

您可以用擴展做到這一點:

我們的一些測試代碼(ExtensionMock由測試EchoRemote實施和測試的一部分調用) ,但我從未嘗試過。

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 
    }