我有一个简单的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);
但它没有帮助。
答案 0 :(得分:1)
一:如果添加@DefaultDeployment
注释,则不应同时添加@Deployment
注释。 @DefaultDeployment
根据一些"合理的默认值"为您构建部署档案。
二,"合理的默认值"不要以目前的形式为你工作。 @DefaultDeployment
构建一个部署档案,其中包含测试所在的包和所有子包中的类。如果这对您不起作用,您可以随时删除@DefaultDeployment
注释并使用普通的@Deployment
手动构建部署。
答案 1 :(得分:0)
创建WARArchive时,请尝试添加所需的包:
return ShrinkWrap.create(WARArchive.class, "your-company.war")
.addPackages(true, "com.yourcompany");