我正在尝试使用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 包GroupTestUtilcom.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/

10-12 05:21