gpt4 book ai didi

java - Arquillian 测试仅在放置在根包中时才有效

转载 作者:行者123 更新时间:2023-12-02 11:57:26 27 4
gpt4 key购买 nike

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

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

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

但这并没有帮助。

最佳答案

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

第二,“合理的默认值”在当前表单中不适合您。 @DefaultDeployment 构建一个部署存档,其中包含测试所在包和所有子包中的类。如果这对您不起作用,您可以随时删除 @DefaultDeployment 注释并使用普通的旧 @Deployment 手动构建部署。

关于java - Arquillian 测试仅在放置在根包中时才有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47499897/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com