2015-08-25 15 views
0

我試圖將pax-exam插件與testng集成,最終得到以下錯誤。然而它與junit工作正常。TestNG集成的Pax-Exam問題

[org.ops4j.pax.exam.spi.intern.DefaultTestAddress] : NEW ADDRESS= PaxExam-90b1718e-7414-486a-8ae2-b5628e4b7a67 parent=[TestAddress:PaxExam-ea9b0dd3-b693-4efb-8003-7f6b92b05f99 root:PaxExam-ea9b0dd3-b693-4efb-8003-7f6b92b05f99] root=[TestAddress:PaxExam-ea9b0dd3-b693-4efb-8003-7f6b92b05f99 root:PaxExam-ea9b0dd3-b693-4efb-8003-7f6b92b05f99] args=[Ljava.lang.Object;@4f063c0a 
[org.ops4j.pax.exam.spi.intern.DefaultTestAddress] : NEW ADDRESS= PaxExam-652d3b11-ab7c-49d0-bcba-f9d56c9210ee parent=[TestAddress:PaxExam-806e1a66-76ff-44cf-90d9-ff26b658b855 root:PaxExam-806e1a66-76ff-44cf-90d9-ff26b658b855] root=[TestAddress:PaxExam-806e1a66-76ff-44cf-90d9-ff26b658b855 root:PaxExam-806e1a66-76ff-44cf-90d9-ff26b658b855] args=[Ljava.lang.Object;@1e6d1014 
org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.InvocationTargetException; nested exception is java.lang.reflect.InvocationTargetException: null 
java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) 
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) 
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) 
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:103) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:74) 
Caused by: java.lang.NoSuchMethodError: org.testng.internal.MethodInstance.<init>(Lorg/testng/ITestNGMethod;)V 
    at org.ops4j.pax.exam.testng.listener.PaxExam.intercept(PaxExam.java:503) 
    at org.testng.TestRunner.createParallelWorkers(TestRunner.java:995) 
    at org.testng.TestRunner.privateRun(TestRunner.java:747) 
    at org.testng.TestRunner.run(TestRunner.java:608) 
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334) 
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) 
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) 
    at org.testng.SuiteRunner.run(SuiteRunner.java:240) 
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1158) 
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1083) 
    at org.testng.TestNG.run(TestNG.java:999) 
    at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:76) 
    at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:112) 
    at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:115) 
    ... 9 more 

任何想法在這裏出了什麼問題?

以下是我的示例測試代碼。我認爲這是我們可以編寫的基本測試案例。

import org.ops4j.pax.exam.Configuration; 
import org.ops4j.pax.exam.Option; 
import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; 
import org.ops4j.pax.exam.spi.reactors.PerClass; 
import org.ops4j.pax.exam.testng.listener.PaxExam; 
import org.osgi.framework.BundleContext; 
import org.testng.annotations.Listeners; 
import org.testng.annotations.Test; 

import javax.inject.Inject; 

import static org.testng.Assert.assertNotNull; 
import static org.ops4j.pax.exam.CoreOptions.*; 


@Listeners(PaxExam.class) 
@ExamReactorStrategy(PerClass.class) 
public class SampleTest { 

    @Inject 
    BundleContext bundleContext; 

    @Configuration 
    public Option[] config() { 

     return options(
       mavenBundle().artifactId("testng").groupId("org.testng").versionAsInProject() 
     ); 
    } 

    @Test 
    public void testBundleContextStatus() { 
     assertNotNull(bundleContext, "Bundle Context is null"); 
    } 
} 

這裏是我使用的依賴關係。

<dependency> 
      <groupId>org.testng</groupId> 
      <artifactId>testng</artifactId> 
      <version>${testng.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.ops4j.pax.exam</groupId> 
      <artifactId>pax-exam</artifactId> 
      <version>${exam.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.ops4j.pax.exam</groupId> 
      <artifactId>pax-exam-container-native</artifactId> 
      <version>${exam.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.ops4j.pax.exam</groupId> 
      <artifactId>pax-exam-testng</artifactId> 
      <version>${exam.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.ops4j.pax.exam</groupId> 
      <artifactId>pax-exam-link-mvn</artifactId> 
      <version>${exam.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.ops4j.pax.url</groupId> 
      <artifactId>pax-url-aether</artifactId> 
      <version>${url.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>${slf4j.api.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.ow2.spec.ee</groupId> 
      <artifactId>ow2-jta-1.1-spec</artifactId> 
      <version>${ow2.jta.spec.version}</version> 
      <scope>test</scope> 
     </dependency> 

將testng depenedncy版本更改爲6.3.1後,它正常工作。但最新發布的版本是6.9.6問題。

+0

「pax-exam插件」沒有這樣的東西 - 你究竟想要做什麼? –

+0

在Pax Exam迴歸測試套件中有TestNG的工作示例,可能會幫助您入門。 –

+0

我的壞它應該是pax考試OSGi測試容器。我添加了我用過的示例依賴項。 –

回答

1

問題的最新編輯包含答案。使用TestNG 6.8.17編譯Pax Exam 4.6.0,顯然TestNG 6.9.x中有一個不兼容的API更改。

Pax考試直接使用TestNG的一些內部類缺乏更好的選擇。

你最好在一般情況下使用Pax Exam和JUnit。 JUnit集成度更高,在OPS4J和其他下游項目中有更多的測試覆蓋率和使用量。