【问题标题】:Arquillian mixed mode not working on TestNGArquillian 混合模式不适用于 TestNG
【发布时间】: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


    【解决方案1】:

    来自文档Arquillian documentation - Mixed Mode

    不同运行模式的效果取决于所使用的 DeployableContainer。这两种模式在某些嵌入式容器中的行为似乎相同,但您应该避免混合内部和外部测试。一件事是他们应该测试你的应用程序的不同方面和不同的用例,另一件事是你会错过切换 DeployableContainers 的好处,如果你这样做的话,你会在远程服务器上运行相同的测试套件。

    也许这就是问题所在,您的 EAR 混合了上下文。如果可能的话,您可能不得不使用 WAR。

    愚蠢的问题,这可能会奏效,您是否尝试强制测试顺序?将 as-client 作为最后一个测试用例运行可能会解决您的问题。

    【讨论】:

      猜你喜欢
      • 2022-06-20
      • 2019-11-13
      • 2021-01-30
      • 2021-07-25
      • 1970-01-01
      • 2010-11-08
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多