【问题标题】:Use @ArquillianResource to inject URL when deploying an EnterpriseArchive部署 EnterpriseArchive 时使用 @ArquillianResource 注入 URL
【发布时间】:2022-01-07 15:35:04
【问题描述】:

我正在使用 Arquillian 针对 Jakarta EE 应用程序服务器对应用程序进行功能测试。

我遇到了无法正确注入 servlet URL 以进行测试的问题。

public class SecurityTests extends ArquillianTests {
    @ArquillianResource(SecurityServlet.class)
    URL baseURL;

    @Deployment(testable=false)
    public static EnterpriseArchive createDeployment() {
        WebArchive war = ShrinkWrap.create(WebArchive.class)
                .addPackages(true, SecurityServlet.class.getPackage());
        
        JavaArchive jar = ShrinkWrap.create(JavaArchive.class)
                .addClasses(SecurityTestRemote.class, SecurityTestEjb.class)
                .addAsManifestResource(ContextTests.class.getPackage(), "ejb-jar.xml", "ejb-jar.xml");
        
        EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class)
                .addAsModules(war, jar)
                .addAsManifestResource(ContextTests.class.getPackage(), "sun-ejb-jar.xml", "sun-ejb-jar.xml");
        
        return ear;
    }
}
@WebServlet("/SecurityServlet")
public class SecurityServlet extends HttpServlet

部署我的企业存档时,存档及其模块都被随机命名,例如:

> 681737db-3621-4b1a-b77a-4f571b877126.ear
  > META-INF
  > 5f6d70e5-13f9-4d49-a32f-c7b3138da9fa.war
    > WEB-INF ...
  > 90772573-9202-4c77-b8b9-99b5869dd29f.jar
    > META-INF ...
  • 如果我只使用@ArquillianResource URL baseURL;
  • 然后baseURL将设置为http://localhost:8010/681737db-3621-4b1a-b77a-4f571b877126

然而,servlet 部署在与模块名称匹配的端点,所以我希望得到http://localhost:8010/5f6d70e5-13f9-4d49-a32f-c7b3138da9fa

  • 如果我使用@ArquillianResource(SecurityServlet.class) URL baseURL;
  • 然后我得到一个异常
arquillianBeforeTest(jakarta.enterprise.concurrent.spec.ManagedScheduledExecutorService.security.SecurityTests)  Time elapsed: 4.134 sec  <<< FAILURE!
java.lang.RuntimeException: Could not lookup value for field java.net.URL jakarta.enterprise.concurrent.spec.ManagedScheduledExecutorService.security.SecurityTests.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)
Caused by: java.lang.RuntimeException: All Providers for type class java.net.URL returned a null value: [org.jboss.arquillian.container.test.impl.enricher.resource.URLResourceProvider@9e28539]
    at org.jboss.arquillian.test.impl.enricher.resource.ArquillianResourceTestEnricher.lookup(ArquillianResourceTestEnricher.java:126)
    at org.jboss.arquillian.test.impl.enricher.resource.ArquillianResourceTestEnricher.enrich(ArquillianResourceTestEnricher.java:66)
    at org.jboss.arquillian.test.impl.TestInstanceEnricher.enrich(TestInstanceEnricher.java:51)
    at org.jboss.arquillian.container.test.impl.ClientTestInstanceEnricher.enrich(ClientTestInstanceEnricher.java:48)

问题:

  1. 我的假设是否正确,我需要使用 @ArquillianResource(SecurityServlet.class)
  2. 如果是,异常可能是由我正在使用的容器实现引起的吗? (我使用的是OpenLiberty
  3. 如果不是,获取模块 URL 的正确方法是什么?

更新:

已启用 Liberty 功能

<featureManager>
  <!-- Features being tested -->
  <feature>jakartaee-9.1</feature>
  <!-- Supporting features -->
  <feature>jndi-1.0</feature> 
  <!-- Features needed for arquillan support -->
  <feature>localConnector-1.0</feature>
  <feature>restConnector-2.0</feature>
  <feature>arquillian-support-jakarta-2.0</feature>
</featureManager>

依赖关系

<dependency>
  <groupId>io.openliberty.arquillian</groupId>
  <artifactId>arquillian-liberty-remote-jakarta-testng</artifactId>
  <version>2.0.2</version>
  <type>pom</type>
  <scope>test</scope>
<dependency>

【问题讨论】:

    标签: java jakarta-ee jboss-arquillian open-liberty


    【解决方案1】:

    编辑说明:我从您的更新中看到您正在使用远程容器,所以我添加了一个关于它的部分。

    使用托管容器

    我认为您的测试代码是正确的。 liberty arquillian 容器有一个类似的测试 here

    如果您使用的是 Java EE 7 或 8 功能,请确保您启用了 j2eeManagement-1.1 功能,因为 liberty arquillian 容器使用它来查找 servlet 的正确上下文根。 Docs here.

        <feature>j2eeManagement-1.1</feature> <!-- Optional, needed to allow injection on ArquillianResources related to servlets -->
    

    如果您使用的是 Jakarta EE 9 功能,那么它应该可以在没有这个的情况下工作。

    使用远程容器

    看起来远程容器中缺少用于查找 servlet 的逻辑(从当前版本 2.0.1 开始)。

    请问您可以在liberty-arquillian repository 上打开一个问题吗?

    在短期内,如果可能,您可以尝试改用托管容器。

    【讨论】:

    • 谢谢,我更新了问题以包含我正在使用的功能。我正在使用 jakartaee-9.1 功能,但仍然看到这种行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2012-05-31
    • 2010-10-12
    • 2020-10-11
    相关资源
    最近更新 更多