2012-11-07 115 views
1

我有一個單元測試的maven項目,運行「mvn install」時會得到一個很大的異常跟蹤。令人驚訝的是 - 這個堆棧跟蹤實際上不會導致任務失敗!它似乎與Junit庫的可用性有關...當mvn安裝失敗 -

1)我想知道如何解決這個(顯然)這個項目,使庫可用和測試運行(是的,Junit4是在pom.xml依賴關係中)。

2)明確調試這個並找到根本原因的最好方法是什麼?

3)爲什麼Maven的說「打造成功」時,明確了萬無一失的工具扔了一個討厭的例外?

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:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164) at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110) at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:172) at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:104) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:70) Caused by: java.lang.NoClassDefFoundError: Test at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2427) at java.lang.Class.getMethod0(Class.java:2670) at java.lang.Class.getMethod(Class.java:1603) at org.apache.maven.surefire.util.ReflectionUtils.tryGetMethod(ReflectionUtils.java:57) at org.apache.maven.surefire.common.junit3.JUnit3TestChecker.isSuiteOnly(JUnit3TestChecker.java:65) at org.apache.maven.surefire.common.junit3.JUnit3TestChecker.isValidJUnit3Test(JUnit3TestChecker.java:60) at org.apache.maven.surefire.common.junit3.JUnit3TestChecker.accept(JUnit3TestChecker.java:55) at org.apache.maven.surefire.common.junit4.JUnit4TestChecker.accept(JUnit4TestChecker.java:52) at org.apache.maven.surefire.util.DefaultDirectoryScanner.locateTestClasses(DefaultDirectoryScanner.java:80) at org.apache.maven.surefire.junit4.JUnit4Provider.scanClassPath(JUnit4Provider.java:174) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:83) ... 9 more Caused by: java.lang.ClassNotFoundException: Test at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ... 21 more

POM低於

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>rudolf</groupId> 
    <artifactId>r1</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>r1</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.1</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>commons-lang</groupId> 
      <artifactId>commons-lang</artifactId> 
      <version>2.3</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-io</artifactId> 
      <version>1.3.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.derby</groupId> 
      <artifactId>derby</artifactId> 
      <version>10.9.1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.google.protobuf</groupId> 
      <artifactId>protobuf-java</artifactId> 
      <version>2.4.0a</version> 
     </dependency> 
    </dependencies> 


    <build> 
     <plugins> 
      <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.9</version> 
      <executions> 
       <execution> 
        <phase>test</phase> 
        <goals> 
         <goal>test</goal> 
        </goals> 
       </execution> 
      </executions> 
      </plugin>   
      <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.3.2</version> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
      </plugin> 
     </plugins> 
    </build> 



    <pluginRepositories> 
     <pluginRepository> 
      <id>onejar-maven-plugin.googlecode.com</id> 
      <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url> 
     </pluginRepository> 
    </pluginRepositories> 
</project> 
+0

你能告訴我們你的'pom.xml'嗎? – maba

+0

你是否從命令行運行?該主題說Eclipse。 –

+0

是的,好點 - 我確定了標題。 – jayunit100

回答

2

這是definetly愚蠢的完美風暴:

1)我的測試類是不按默認萬無一失的正則表達式見命名相關Maven does not find JUnit tests to run。所以測試並沒有真正運行。

2)這並運行測試實際上是做一些JVM黑客,使用類,如「不安全」 - 導致分割故障。這種分段錯誤會隨着Maven的整體構建而消失,從而破壞Maven輸出的結果。

的帶回家的教訓是:

1)(不是100%肯定,但它似乎) - 如果MVN構建過程中發生JVM一些奇怪的低水平失敗,人們可能預期奇怪的結果在結束時,不只是以正確的方式指示錯誤/失敗

2)Defaultfire行爲的默認Junit測試用例不會自動運行包中的所有@Test方法 - 必須正確命名類,否則必須手動編輯surefire模式過濾器。

+0

嗨@ jayunit100:請你讓我知道做了什麼樣的改變來消除這個錯誤。 因爲我得到了與「建立成功」相同的錯誤。你可以幫我嗎。 – techGaurdian

+0

避免混JUnit測試版本的3/4,避免做單元測試JVM黑客如果可以的話,否則,我不記得 – jayunit100

+0

肯定。感謝您的信息。 – techGaurdian

0

我遇到了像TestNG集成測試(故障安全)這樣的問題。一個類似的真正神祕的錯誤使我失去了一整天(唉! - 請,Eclipse/TestNG,如果你要給我們錯誤,讓他們有用)。就我而言,這是因爲測試方法的訪問者是私人的,需要公開。

我希望別人在浪費一整天之前找到這個有用的東西。