我们在JUnit中使用EJBContainer测试EJB。测试bean调用的另一个EJB使用@alternative
bean进行测试。此模拟bean在<alternative>
beans.xml
一切都像魅力一样,EJB经过测试并使用模拟服务。
问题:是否可以仅使用代码执行相同操作,而不是使用beans.xml?
当然beans.xml
提供了很好的灵活性,但有时候人们可能希望为同一个bean设置不同的@alternative
,并且可以在同一个项目中为单个/其他测试选择一个特定的。或许另一种解决方案是针对某些测试的特定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>
答案 0 :(得分:3)
您可以扩展现有的实现并使用@Specializes注释,而不是创建独立的@Alternative实现。
另请参阅:http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Specializes.html
答案 1 :(得分:1)
您可以通过扩展程序执行此操作,但我从未尝试过。
答案 2 :(得分: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
}