我正在处理遗留项目(jee 5,jboss 4.2.3),我需要为这个应用程序编写集成测试。我能够集成arquillian远程模块并运行简单的测试。但现在我想使用mockito在我的ejb中模拟一些服务。
示例:
一些ejb
@Local
public interface DummyService {
String welcomMessage();
}
@Stateless
@LocalBinding(jndiBinding = "ejb/DummyServiceBean/local")
public class DummyServiceBean implements DummyService {
@EJB(mappedName = "ejb/DummyServiceBean2/local")
private DummyService2 service;
@Override
public String welcomMessage() {
return "world!!!!" + " " + service.getSomething();
}
}
@Local
public interface DummyService2 {
String getSomething();
}
@Stateless
@LocalBinding(jndiBinding = "ejb/DummyServiceBean2/local")
public class DummyServiceBean2 implements DummyService2 {
@Override
public String getSomething() {
return "sth";
}
}
测试类
@RunWith(Arquillian.class)
public class DummyServiceTest {
@EJB(mappedName = "ejb/DummyServiceBean/local")
private DummyService service;
@Mock
private DummyService2 service2;
@Deployment
public static Archive<?> createDeployment() {
final JavaArchive javaArchive = ShrinkWrap.create(JavaArchive.class, "test.jar")
.addClasses(DummyService.class, DummyServiceBean.class,
DummyService2.class, DummyServiceBean2.class,
DummyServiceTest.class, InjectMocks.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
return ShrinkWrap.create(EnterpriseArchive.class, "test.ear")
.setApplicationXML(new File("application.xml"))
.addAsLibraries( // add maven resolve artifacts to the deployment
DependencyResolvers.use(MavenDependencyResolver.class)
.loadMetadataFromPom("pom.xml")
.artifact("org.mockito:mockito-all:1.9.5")
.resolveAs(GenericArchive.class))
.addAsModule(javaArchive);
}
@Before
public void setupMock() {
when(service2.getSomething()).thenReturn("qwerty");
}
@Test
public void should_assert_a_behaviour() {
System.out.println("Hello " + service.welcomMessage());
}
}
我可以通过不在存档中添加DummyServiceBean2.class并在测试目录中创建类似的东西来实现这一点:
@Stateless
@LocalBinding(jndiBinding = "ejb/DummyServiceBean2/local")
public class MockDummyServiceBean2 implements DummyService2 {
@Override
public String getSomething() {
return "mock sth";
}
}
但这是不好的做法。我有想法在运行时DummyServiceBean2代理引用期间使用DummyServiceBean类中的反射交换一个新的InvocationHandler,它在他的invoke方法中使用mock但最终出现异常
IllegalArgumentException: Can not set com.example.DummyService2 field com.example.DummyServiceBean.service to com.sun.proxy.$Proxy71
任何想法如何为新的交换/替换DummyServiceBean2代理或如何替换现有的调用处理程序?