我有一个简单的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 回答
一:如果添加
@DefaultDeployment
注释,则不应同时添加@Deployment
注释 .@DefaultDeployment
根据某些"sensible defaults"为您构建部署档案 .二,"sensible defaults"在当前表格中不适合你 .
@DefaultDeployment
构建一个部署档案,其中包含测试所在的包和所有子包中的类 . 如果这对您不起作用,您可以随时删除@DefaultDeployment
注释并使用普通旧@Deployment
手动构建部署 .在创建WARArchive时,请尝试添加所需的包: