如何使用native-maven插件在JNI .so创建后运行JUnit测试

时间:2019-05-20 19:01:06

标签: maven junit build native-maven-plugin

我有一个同时创建jni .so文件和java .jar文件的项目。除了JUnit测试执行之外,所有这些工作均按预期进行。在native-maven-plugin创建.so文件之后,我需要运行JUnit测试。添加新的JNI方法时,JUnit测试将始终失败,因为它们在创建共享库之前就在运行。唯一的选择是要构建两次?意思是构建一次跳过测试,然后单独执行测试还是再次运行构建以执行测试?

2 个答案:

答案 0 :(得分:0)

我猜您正在使用native-maven-plugin中的native:link goal吗?

如果您查看目标的文档,则会发现该目标默认情况下已绑定到生命周期阶段 package

默认情况下,

junit测试(由maven-surefire-plugin运行)在生命周期阶段 test (https://maven.apache.org/surefire/maven-surefire-plugin/test运行-mojo.html)。

maven lifecycle reference

您可以看到 test 阶段早于 package 阶段。这说明了更改后测试失败的原因。首先运行测试,然后生成.so文件。

您可以在{em> package 阶段之后使用maven-failsafe-plugin来运行测试。

将插件添加到您的版本中,并将在 package 之后应运行的所有测试命名为 MySpecificFeatureIT (后缀IT表示集成测试)。名为 MyFeatureTest 的测试仍将在 test 阶段运行。

有关详细信息,请参阅插件文档

答案 1 :(得分:0)

好的,这是一个项目结构问题。在我的JNI项目中构建了JNI .so之后,我试图运行属于另一个项目的测试。我需要做的是将我创建的JNI集成测试放在src / java / test的JNI项目中,而不是另一个项目中,然后尝试以某种方式订购它们。

jni -  
     |  
     src  
       |  
       java  
           |  
           test  

不是

other project-
              |
              src
                 |
                 java
                     |
                     test

当然,在其他项目建立之后,maven进行了另一个项目测试。那是应该做的。即使JNI项目建立了C .so文件。当运行Java测试时,用于Java的测试规则仍然适用于JNI项目。