有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Arquillian测试只有放在根包中才能工作

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

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

@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

ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 5) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./: java.lang.NoClassDefFoundError: Lcom/mycompany/service/MyService;

...

Caused by: java.lang.ClassNotFoundException: com.mycompany.service.MyService from [Module "deployment.MyEndpointIT.war:main" from Service Module Loader]

但是,如果我把我的测试提高一个级别,它就可以正常工作了(男士进入com.mycompany包)

问题:为什么测试会以如此奇怪的方式进行?这是记录在案的行为吗?我如何将测试放入测试类所在的相同包中

我还试着使用这样的技巧:

warArchive.addClass(MyService.class);

但这没用


共 (1) 个答案

  1. # 1 楼答案

    创建WARCHIVE时,请尝试添加所需的软件包:

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