0

我正在尝试使用 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 文件。
有人已经遇到过这个问题吗?

4

1 回答 1

0

我对 Arquillian 或其 Liferay 集成没有任何真正的了解,所以这个答案部分基于实验和推测。

GroupTestUtil应该已经通过 bundle 在 Liferay 运行时中可用com.liferay.portal.test。检查该类是否存在并已导出很容易。

OSGi 框架在解析时根据其清单中 Import-Package 指令的内容构建捆绑包的类路径;该列表中未引用其包的类对捆绑包不可用。使用清单生成通常不是问题。

您的测试类可能已编译到与被测模块不同的构建目录。尽管 Arquillian 将在与部署的包相同的类路径中运行其测试(根据我的测试),但 bnd 不使用测试类来生成 Import-Package 指令,它不是包的一部分,但不是能够使用包中未引用的包。

修复很简单。GroupTestUtil在你的 bnd-test.bnd 中显式地 import的包:

Import-Package: \
    com.liferay.portal.kernel.test.util,\
    *

*第二行的 指示 bnd 继续自己生成其他导入。)

于 2016-08-22T20:43:44.710 回答