Arquillian和ejb嘲笑 - 遗留应用程序

时间:2014-04-19 19:54:56

标签: ejb-3.0 mockito jboss-arquillian legacy-code jboss-4.2.x

我正在处理遗留项目(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代理或如何替换现有的调用处理程序?

0 个答案:

没有答案