2014-05-22 167 views
4

我想通過一個Ant任務來啓動我的JUnit測試,如下圖所示:的JUnit的Eclipse VS螞蟻

<target name="TestDaoImpl"> 
     <mkdir dir="${junit.output.dir}"/> 
     <junit fork="yes" printsummary="withOutAndErr"> 
      <jvmarg line="${conf.dir}"/> 
      <formatter type="xml"/> 
      <test name="my.package.TestKSLDaoImpl" todir="${junit.output.dir}"/> 
      <classpath refid="My.classpath"/> 
     </junit> 
</target> 

在我的測試我使用PowerMockito,這兩種情況:

PowerMockito.whenNew(Convert.class).withAnyArguments().thenReturn(convert); 
PowerMockito.mockStatic(MyService.class); 

和Mockito:

Mockito.when(convert.getXmlKsl(folder)).thenReturn(xmlStr); 

其實當我在Eclipse中運行我的測試時,我沒有得到任何錯誤。 但是當我通過Ant任務啓動它,我得到這個錯誤:

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'. 
For example: 
    when(mock.getArticles()).thenReturn(articles); 

Also, this error might show up because: 
1. you stub either of: final/private/equals()/hashCode() methods. 
    Those methods *cannot* be stubbed/verified. 
2. inside when() you don't call method on mock but on some other object. 
3. the parent of the mocked class is not public. 
    It is a limitation of the mock engine. 

at org.powermock.api.mockito.PowerMockito.when(PowerMockito.java:495) 

的錯誤是在這裏:

PowerMockito.mockStatic(MyService.class); 

===> Mockito.when(MyService.getInstance(myId)).thenReturn(myService); 

我用這瓶:

JUnit 4 
cglib-nodep-2.2.2.jar 
javassist-3.18.1-GA.jar 
mockito-all-1.9.5.jar 
objenesis-2.1.jar 
powermock-mockito-1.5.4-full.jar 

是否有任何與螞蟻和PowerMockito衝突? 爲什麼測試通過eclipse運行良好,但不通過Ant?

+1

這些類型的問題(構建在命令行或IDE上工作,但不在其他類型中)的典型原因與類路徑中的差異有關。通常,命令行工具和IDE將以不同方式解決依賴關係。 –

+0

您使用的是哪種版本的JUnit? –

+0

只是一個旁註:在西班牙語mockito意味着「小鼻涕」。就這樣 –

回答

2

爲什麼測試可能通過在Eclipse中,但在命令行中運行失敗:

這類問題的原因,建造傳遞任何命令行或IDE而不是兩個,通常與類路徑中的差異有關。通常,命令行工具和IDE將以不同方式解決依賴關係。此外,大多數IDE還附帶自己的JUnit版本,可能與項目指定的版本不匹配。

要解決此問題,您需要分析命令行工具(本例中爲Ant)和您的IDE使用的類中的差異。請記住,當一個類包含在多個依賴項中時,依賴關係在命令行上的顯示順序非常重要。

「全部」指定意味着所有依賴類都預先打包到jar中,如果包含更新版本的依賴關係,那麼會導致問題,然後預打包。例如,如果您對Mockito-All 1.9.5(其中包含Hamcrest 1.1預包裝和Hamcrest 1.3)有依賴關係,那麼您將在類路徑中擁有同一個jar的兩個不同副本。這並不總是一個問題,除非你試圖使用一個版本的方法,而不是另一個。通常使用首先列出哪個版本。

某些版本的JUnit 4,Mockito-all 1.9.5和Hamcrest存在一些已知的依賴關係問題。我會建議指定:JUnit 4.11,Mockito-core 1.9.5和Hamcrest 1.3。您需要檢查以確保Eclipse正在使用這些版本,而不是替換它自己的版本。

衝突Ant和PowerMockito之間:

Ant是一個構建工具,不應該有任何PowerMock衝突。您可能需要花費時間和精力升級到具有更好依賴性管理的更現代的構建工具。 Maven和Gradle都得到了很好的支持。