gpt4 book ai didi

java - 在 Arquillian 测试中难以将包添加到 Shrinkwrap 存档中

转载 作者:行者123 更新时间:2023-12-01 10:00:30 25 4
gpt4 key购买 nike

我正在尝试使用 ShrinkWrap 将包 org.jibble.pircbot 添加到我的测试存档中。我已经尝试了我能想到的所有变体,但在所有情况下都找不到该包。但是,由于某种原因,可以单独添加这些类,但不会添加任何匿名内部类。

  @Deployment
public static WebArchive createDeployment() {
return ShrinkWrap.create(WebArchive.class, "RcCustomerTest.war")
// .addPackages(true, PircBot.class.getPackage())
// .addPackages(true, "org.jibble.pircbot")
.addClasses(PircBot.class,
ReplyConstants.class,
IrcException.class,
NickAlreadyInUseException.class,
InputThread.class,
OutputThread.class,
Queue.class)
.addClass(DccManager.class) // Inner classes not added!
.addPackages(true, "com.recursiveloop.webcommon")
.addPackages(true, "com.recursiveloop.jloop.core.irc")
.addAsResource("config.properties")
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml")
.addAsWebInfResource("jboss-web.xml", "jboss-web.xml")
.addAsWebInfResource("jboss-deployment-structure.xml", "jboss-deployment-structure.xml")
.addAsResource("persistence.xml", "META-INF/persistence.xml")
.setWebXML("web.xml");
}

这会导致异常

...
Caused by: java.lang.NoClassDefFoundError: org/jibble/pircbot/DccManager$1
at org.jibble.pircbot.PircBot.<init>(PircBot.java:3081)
...

这很奇怪,因为浏览收缩包装源代码我发现一个函数可以做出以下断言

Assert.assertTrue("Adding a class should also add the anonymous inner classes",
getArchive().contains(expectedPathAnonymousInnerClass));

但遗憾的是,似乎没有测试用例实际调用此函数。

但是,问题仍然存在 - 为什么当我调用 addPackages(true, "org.jibble.pircbot") 时,shrinkwrap 找不到包?我查看了生成的存档,没有 org.jibble.pircbot 的迹象,显然存在不可避免的 ClassDefNotFound 异常:

...
Caused by: java.lang.NoClassDefFoundError: Failed to link com/recursiveloop/jloop/core/irc/VisitorConnection (Module "deployment.RcCustomerTest.war:main" from Service Module Loader): org/jibble/pircbot/PircBot
...

我正在使用 gradle,但如果我使用 maven,maven 解析器可能会完成这项工作。有一个 gradle 解析器,但它不完全做同样的事情。我使用它的最佳尝试如下

return ShrinkWrap.create(EmbeddedGradleImporter.class)
.forProjectDirectory()
.forTasks("integTestWar")
.importBuildOutput("build/libs/integTest.war").as(WebArchive.class);

这将启动 gradle 任务并将测试类插入到生成的存档中。挑战是让 gradle 构建正确的 war 文件。我希望它包含属于集成测试源集而不是主源集的资源文件(部署描述符等),但我就是无法让它工作。

仅供引用,我正在使用 Shrinkwrap 版本 1.2.3,这是最新的。

任何帮助将不胜感激。

最佳答案

我通过使用maven解析器解决了这个问题,如下:

return ShrinkWrap.create(WebArchive.class, "RcCustomerTest.war")
.addAsLibraries(Maven.resolver()
.loadPomFromFile("build/pom.xml")
.resolve("pircbot:pircbot")
.withTransitivity().asFile())

...

POM文件是使用gradle的eclipse插件生成的,就像这样

task writeNewPom << {
pom {
writeTo("$buildDir/pom.xml")
}
}

设置为在集成测试之前运行。

事实证明,maven 解析器可以在没有 POM 的情况下使用,但您必须在测试中指定工件并确保它与您的项目使用的内容保持最新。集成测试已经很难维护,因此最好解决 POM 的依赖关系,这样您就知道它是正确的版本(少了一件需要担心的事情)。

关于java - 在 Arquillian 测试中难以将包添加到 Shrinkwrap 存档中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36851559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com