我正在尝试使用gradle,arquillian和bnd工具为liferay 7 portlet编写集成测试。
这是我在测试类中的部署方法:
@Deployment
public static JavaArchive create() throws IllegalArgumentException, FileNotFoundException {
print("Eseguo il Deployment");
BndProjectBuilder bndProjectBuilder = ShrinkWrap.create(BndProjectBuilder.class);
bndProjectBuilder.setBndFile(new File("bnd-test.bnd"));
bndProjectBuilder.generateManifest(true);
JavaArchive j = bndProjectBuilder.as(JavaArchive.class);
return j;
}
这是bnd-test.bnd文件:
Bundle-Name: Beep Col Portlet Test
Bundle-SymbolicName: it.polimi.metid.beep.beepcol.test
Bundle-Version: 1.0.0
Include-Resource:build/classes/main,META-INF/resources=src/main/resources/META-INF/resources
Require-Capability:\
osgi.extender;filter:="(&(osgi.extender=jsp.taglib)(uri=http://liferay.com/tld/ddm))",\
osgi.extender;filter:="(&(osgi.extender=jsp.taglib)(uri=http://liferay.com/tld/frontend))",\
osgi.extender;filter:="(&(osgi.extender=jsp.taglib)(uri=http://java.sun.com/portlet_2_0))",\
osgi.extender;filter:="(&(osgi.extender=jsp.taglib)(uri=http://liferay.com/tld/aui))",\
osgi.extender;filter:="(&(osgi.extender=jsp.taglib)(uri=http://liferay.com/tld/portlet))",\
osgi.extender;filter:="(&(osgi.extender=jsp.taglib)(uri=http://liferay.com/tld/theme))",\
osgi.extender;filter:="(&(osgi.extender=jsp.taglib)(uri=http://liferay.com/tld/ui))",\
osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
-jsp: *.jsp,*.jspf
-plugin.bundle: com.liferay.ant.bnd.resource.bundle.ResourceBundleLoaderAnalyzerPlugin
-plugin.jsp: com.liferay.ant.bnd.jsp.JspAnalyzerPlugin
-plugin.sass: com.liferay.ant.bnd.sass.SassAnalyzerPlugin
-sass: *
-sources: true
-dsannotations: *
使用功能测试可以很好地工作,但是当我尝试执行一些集成测试并尝试使用外部库(例如,
com.liferay.portal:com.liferay.portal.test; version ='1.0.0'
当我要使用该库的某些类时,如下所示:
@Test
public void prova() throws Exception {
Group g = GroupTestUtil.addGroup();
}
我得到这个异常:
java.lang.NoClassDefFoundError: com/liferay/portal/kernel/test/util/GroupTestUtil
我认为这是因为BndProjectBuilder不包含依赖项jar,或者我不好配置bnd文件。
有人已经遇到这个问题了吗?
最佳答案
我对Arquillian或其Liferay集成没有任何真正的了解,因此此答案部分基于实验和推测。
通过 bundle 包GroupTestUtil
,com.liferay.portal.test
应该已经在Liferay运行时中可用。检查类是否存在并被导出很容易。
OSGi框架基于 list 中的Import-Package指令的内容,在解析时构建 bundle 的类路径。在该列表中未引用其包的类对该 bundle 包不可用。使用 list 生成时通常不是问题。
您的测试类可能已编译到与被测模块不同的构建目录。尽管Arquillian将在与部署的包相同的类路径中运行其测试(根据我的测试),但bnd并不使用测试类来生成Import-Package指令,它不是包的一部分,但不是能够使用 bundle 软件中未引用的软件包。
解决方法很简单。在您的bnd-test.bnd中明确导入GroupTestUtil
的包:
Import-Package: \
com.liferay.portal.kernel.test.util,\
*
(第二行上的
*
指示bnd继续自行生成其他导入。)关于java - Gradle bndProjectBuilder测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38333649/