【发布时间】: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)
问题:
- 我的假设是否正确,我需要使用
@ArquillianResource(SecurityServlet.class)? - 如果是,异常可能是由我正在使用的容器实现引起的吗? (我使用的是OpenLiberty)
- 如果不是,获取模块 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