Arquillian测试仅在将其放置在根包中时才起作用

时间:2017-11-26 19:03:09

标签: java jboss-arquillian wildfly-swarm

我有一个简单的Wildfly Swarm应用程序,它通过CDI将JAX-RS端点和Service类注入端点。

我为我的应用编写了一个集成测试,它看起来像这样:

@RunWith(Arquillian.class)
@DefaultDeployment(type = WAR)
public class MyEndpointIT {

    @ArquillianResource
    private URI uri;

    @Deployment
    public static WARArchive createDeployment() throws Exception {
        return ShrinkWrap.create(WARArchive.class);
    }

    @Test
    public void shouldGet() {
        Client client = ClientBuilder.newClient();
        Invocation.Builder request = client.target(uri)
                .path("/api/my-endpoint")
                .request();

        Response response = request.get();

        assertThat(response.getStatusInfo(), is(OK));
    }
}  

问题:只有将测试放入包层次结构的根级别时,测试才有效。 假设我的项目结构看起来像这样。

com
├ mycompany
| ├ rest
| | └ MyEndpoint.java
| ├ service
| | └ MyService.java

如果我在com.mycompany.rest中创建了集成测试,则会失败并显示NoClassDefFoundError

  

错误[org.jboss.msc.service.fail](ServerService线程池 - 5)MSC000001:无法启动服务jboss.undertow.deployment.default-server.default-host./:org.jboss.msc服务中的.service.StartException:jboss.undertow.deployment.default-server.default-host。/:java.lang.NoClassDefFoundError:Lcom / mycompany / service / MyService;

     

...

     

引起:java.lang.ClassNotFoundException:来自[Module“deployment.MyEndpointIT.war:main”from service Module Loader]的com.mycompany.service.MyService

但是,如果我将我的测试添加到一个级别更高,它可以正常工作(男性进入com.mycompany包)。

问题:为什么测试以这种奇怪的方式工作?它是否记录了行为?如何将测试放入测试类所在的相同包中?

我也尝试使用这样的技巧:

warArchive.addClass(MyService.class);

但它没有帮助。

2 个答案:

答案 0 :(得分:1)

一:如果添加@DefaultDeployment注释,则不应同时添加@Deployment注释。 @DefaultDeployment根据一些"合理的默认值"为您构建部署档案。

二,"合理的默认值"不要以目前的形式为你工作。 @DefaultDeployment构建一个部署档案,其中包含测试所在的包和所有子包中的类。如果这对您不起作用,您可以随时删除@DefaultDeployment注释并使用普通的@Deployment手动构建部署。

答案 1 :(得分:0)

创建WARArchive时,请尝试添加所需的包:

return ShrinkWrap.create(WARArchive.class, "your-company.war")
         .addPackages(true, "com.yourcompany");