如何测试使用Infinispan的JAX-RS应用程序(JBoss 7 + Arquillian)

时间:2013-05-27 14:15:37

标签: exception dependency-injection jboss7.x jboss-arquillian infinispan

信息:我的应用程序是一个简单的JAX-RS服务,它将一些值存储在JBoss 7.1提供的缓存中。

我想使用Arquillian来调用服务并测试响应。但不幸的是,当我尝试运行测试时,我收到了这个错误:

java.lang.IllegalArgumentException: 
Can not set org.infinispan.manager.CacheContainer field 
com.company.DataCache.container to 
org.jboss.as.clustering.infinispan.DefaultEmbeddedCacheManager

这是我的DataCache类:

@ManagedBean
public class DataCache<K, V> {

  @Resource(lookup="java:jboss/infinispan/container/hibernate")
  private CacheContainer container;
  private Cache<K, V> cache;

  @PostConstruct
  public void start() {
      this.cache = this.container.getCache();
  }

  public Cache<K, V> getCache() {
      return cache;
  }
}

My Testclass看起来像这样:

@RunWith(Arquillian.class)
@RunAsClient
public class SyncClientServerTest extends RbmlClientServerTest {

    @Deployment(testable = false)
    public static WebArchive createDeployment() {
        MavenDependencyResolver mvnResolver = DependencyResolvers.use(MavenDependencyResolver.class).loadMetadataFromPom("pom.xml").goOffline();

        return ShrinkWrap
            .create(WebArchive.class, "cache-service.war")
            .addPackages(true, Filters.exclude(".*ClientServerTest.*"), "com/company")
            .addAsLibraries(mvnResolver.artifact("org.infinispan:infinispan-core:5.2.0.Final").resolveAsFiles())
            .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
    }

    @Test
    public void testStatus() throws Exception {
        ClientRequest request = new ClientRequest("localhost:8080/cache-service/cache");
        request.accept(MediaType.APPLICATION_JSON_TYPE);
        request.body(MediaType.APPLICATION_JSON_TYPE, "");

        ClientResponse<String> responseObj = request.post(String.class);
        assertEquals(200, responseObj.getStatus());
    }
}

问题

  • @Resource从JBoss提供正确的缓存,有没有办法像获取数据库资源一样操作?
  • 有没有办法模拟像getCache()这样的服务调用?

总而言之,我想使用Arquilian进行客户端测试,因为我使用了大量的依赖注入,也许有一个使用@Resource和Infinispan的示例项目。

3 个答案:

答案 0 :(得分:4)

在所有答案之后我得到了答案,我只是想为其他寻找相同问题的人总结一下。

  1. 删除了该行:.addAsLibraries(mvnResolver.artifact("org.infinispan:infinispan-core:5.2.0.Final").resolveAsFiles())
  2. 使用内容MANIFEST.MF
  3. src/test/resource文件添加到Dependencies: org.infinispan export
  4. 将行.addAsManifestResource("MANIFEST.MF")添加到ShrinkWrap
  5. 将以下内容添加到JBoss中的standalone.xml / domain.xml配置文件中:

    <subsystem xmlns="urn:jboss:domain:ee:1.0">
        <global-modules>
            <module name="org.infinispan" slot="main"/>
        </global-modules>
    </subsystem>
    

答案 1 :(得分:1)

您尝试插入的缓存容器是Hibernate的二级缓存。您不应该真正尝试访问Hibernate 2LC的底层缓存。如果您需要有关此缓存的信息,请启用2LC统计信息。

如果您要执行的操作是插入Infinispan缓存,请查看Infinispan JBoss AS7 quickstart,您可以在其中查看如何定义自己的缓存容器,并将其插入CDI应用程序。

答案 2 :(得分:1)

您是否将任何Infinispan类与您的arquillian部署一起打包? Infinispan与JBoss捆绑在一起作为模块,无需部署即可使用。类路径中的Ambigious类名可能会导致该问题。

此致