【发布时间】:2022-01-20 00:01:32
【问题描述】:
我正在尝试使用 Arquillian 和 TestNG 以混合模式运行测试套件。
基于此处的文档:http://arquillian.org/arquillian-core/#mixed-mode
我希望能够像这样编写我的测试:
public class ExampleTest extends Arquillian {
@Deployment
public static EnterpriseArchive createDeployment() {
return ear; //contains both web and jar modules
}
@Test @RunAsClient
public void testA(@ArquillianResource(TestServlet.class) URL baseUrl) {
runTest(baseURL);
}
@EJB //Used for container tests
public TestBean bean;
@Test
public void testB() throws Throwable {
bean.runTest();
}
}
在这种情况下,testA 失败,因为 TestNG 不允许测试方法具有注入参数。
如果相反,我将测试 URL 作为这样的字段注入:
public class ExampleTest extends Arquillian {
@Deployment
public static EnterpriseArchive createDeployment() {
return ear; //contains both web and jar modules
}
@ArquillianResource(TestServlet.class) //Used for client tests
URL baseUrl
@Test @RunAsClient
public void testA() {
runTest(baseURL);
}
@EJB //Used for container tests
public TestBean bean;
@Test
public void testB() throws Throwable {
bean.runTest();
}
}
那么testB 将失败,因为它无法注入 URL 字段,即使它没有被注释为客户端测试:
Could not lookup value for field java.net.URL ExampleTest.baseURL
java.lang.RuntimeException: Could not lookup value for field java.net.URL ExampleTest.baseURL
at org.jboss.arquillian.test.impl.enricher.resource.ArquillianResourceTestEnricher.enrich(ArquillianResourceTestEnricher.java:68)
at org.jboss.arquillian.test.impl.TestInstanceEnricher.enrich(TestInstanceEnricher.java:51)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
...
Caused by: java.lang.RuntimeException: java.lang.TypeNotPresentException: Type TestServlet not present
at org.jboss.arquillian.protocol.servlet5.runner.ServletCommandService.execute(ServletCommandService.java:42)
at org.jboss.arquillian.container.test.impl.enricher.resource.ContainerURLResourceProvider.lookup(ContainerURLResourceProvider.java:46)
at org.jboss.arquillian.test.impl.enricher.resource.ArquillianResourceTestEnricher.lookup(ArquillianResourceTestEnricher.java:116)
at org.jboss.arquillian.test.impl.enricher.resource.ArquillianResourceTestEnricher.enrich(ArquillianResourceTestEnricher.java:66)
... 95 more
Caused by: java.lang.TypeNotPresentException: Type TestServlet not present
at java.base/sun.reflect.annotation.TypeNotPresentExceptionProxy.generateException(TypeNotPresentExceptionProxy.java:46)
at java.base/sun.reflect.annotation.AnnotationInvocationHandler.invoke(AnnotationInvocationHandler.java:86)
at com.sun.proxy.$Proxy37.value(Unknown Source)
at org.jboss.arquillian.container.test.impl.enricher.resource.URLResourceProvider.locateURL(URLResourceProvider.java:67)
at org.jboss.arquillian.container.test.impl.enricher.resource.URLResourceProvider.doLookup(URLResourceProvider.java:51)
at org.jboss.arquillian.container.test.impl.enricher.resource.OperatesOnDeploymentAwareProvider.runInContainerContext(OperatesOnDeploymentAwareProvider.java:130)
at org.jboss.arquillian.container.test.impl.enricher.resource.OperatesOnDeploymentAwareProvider.runInDeploymentContext(OperatesOnDeploymentAwareProvider.java:93)
at org.jboss.arquillian.container.test.impl.enricher.resource.OperatesOnDeploymentAwareProvider.lookup(OperatesOnDeploymentAwareProvider.java:59)
at org.jboss.arquillian.container.test.impl.enricher.resource.RemoteResourceCommandObserver.lookup(RemoteResourceCommandObserver.java:31)
...
Caused by: java.lang.ClassNotFoundException: TestServlet
at java.base/java.lang.Class.forNameImpl(Native Method)
at java.base/java.lang.Class.forName(Class.java:425)
at java.base/sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:114)
at java.base/sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125)
at java.base/sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
at java.base/sun.reflect.annotation.AnnotationParser.parseSig(AnnotationParser.java:440)
at java.base/sun.reflect.annotation.AnnotationParser.parseClassValue(AnnotationParser.java:421)
at java.base/sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:350)
at java.base/sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:287)
at java.base/sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:121)
at java.base/sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:73)
at java.base/java.lang.reflect.Field.declaredAnnotations(Field.java:1175)
at java.base/java.lang.reflect.Field.declaredAnnotations(Field.java:1173)
at java.base/java.lang.reflect.Field.getAnnotation(Field.java:1142)
at java.base/java.lang.reflect.AnnotatedElement.isAnnotationPresent(AnnotatedElement.java:274)
at java.base/java.lang.reflect.AccessibleObject.isAnnotationPresent(AccessibleObject.java:517)
at org.jboss.arquillian.testenricher.ejb.SecurityActions$3.run(SecurityActions.java:237)
at org.jboss.arquillian.testenricher.ejb.SecurityActions$3.run(SecurityActions.java:231)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:678)
at org.jboss.arquillian.testenricher.ejb.SecurityActions.getFieldsWithAnnotation(SecurityActions.java:231)
at org.jboss.arquillian.testenricher.ejb.EJBInjectionEnricher.injectClass(EJBInjectionEnricher.java:101)
...
TestNG 不支持混合模式还是我做错了什么?
感谢您的帮助!
【问题讨论】:
标签: java jakarta-ee testng jboss-arquillian