首页 文章

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

提问于
浏览
0

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

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

@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));
    }
}

Problem: 仅当我将其放入包层次结构的根级别时,该测试才有效 . 假设我的项目结构看起来像这样 .

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

如果我在 com.mycompany.rest 中创建集成测试,它将失败 NoClassDefFoundError

ERROR [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”来自Service Module Loader]的com.mycompany.service.MyService

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

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

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

warArchive.addClass(MyService.class);

但它没有帮助 .

2 回答

  • 0

    一:如果添加 @DefaultDeployment 注释,则不应同时添加 @Deployment 注释 . @DefaultDeployment 根据某些"sensible defaults"为您构建部署档案 .

    二,"sensible defaults"在当前表格中不适合你 . @DefaultDeployment 构建一个部署档案,其中包含测试所在的包和所有子包中的类 . 如果这对您不起作用,您可以随时删除 @DefaultDeployment 注释并使用普通旧 @Deployment 手动构建部署 .

  • 1

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

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

相关问题