我尝试使用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,&#34; org.jibble.pircbot&#34;)?我查看了生成的存档,并且没有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任务,并将测试类插入到生成的存档中。挑战在于建立正确的战争文件。我希望它包含属于集成测试源集的资源文件(部署描述符等),而不是主要的源集,但我无法让它工作。
仅供参考我使用的是最新版本的收缩包版本1.2.3。
非常感谢任何帮助。
答案 0 :(得分:1)
我通过使用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中解析依赖关系,这样你就知道它是正确的版本(不用担心了)。