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 楼答案
创建WARCHIVE时,请尝试添加所需的软件包: