2016-05-29 17 views
0

Mavenを使ってSPOCK Groovyフレームワークで静的Javaメソッドをテストしようとしています。ここでGroovy SPOCKフレームワークで静的なJavaメソッドをテストするには?

は、Javaクラスここ

public class DataController { 

private DataInterface userService; 

    public void setUserService(DataInterface userService) { 
     this.userService = userService; 
    } 
    public static int addNumber(){ 
     int a = 10; 
     int b = 20; 
     return a+b; 
    } 
} 

は、SPOCKテストは、私はグルーヴィーで4のテストケースを持ってグルーヴィー

@PrepareForTest([DataController.class]) 
class BasicMockStaticTest extends Specification { 

@Rule PowerMockRule powerMockRule = new PowerMockRule(); 

    def "When mocking static"() { 
     setup : 
      PowerMockito.mockStatic(DataController.class) 

     when : 
      Mockito.when(DataController.addNumber()).thenReturn(30); 

     then : 
      DataController.addNumber() == 30 
    } 
} 

とPOMファイルスニペット

<dependencies> 
    <!-- Spock Framework basic dependencies: --> 
    <dependency> 
     <groupId>org.codehaus.groovy</groupId> 
     <artifactId>groovy-all</artifactId> 
     <version>2.3.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.spockframework</groupId> 
     <artifactId>spock-core</artifactId> 
     <!-- The version have to be compatible with Groovy --> 
     <version>1.0-groovy-2.3</version> 
     <scope>test</scope> 
    </dependency> 
    <!-- To use Hamcrest matchers: --> 
    <dependency> 
     <groupId>org.hamcrest</groupId> 
     <artifactId>hamcrest-core</artifactId> 
     <version>1.3</version> 
     <scope>test</scope> 
    </dependency> 
    <!-- To mock classes: --> 
    <dependency> 
     <groupId>cglib</groupId> 
     <artifactId>cglib-nodep</artifactId> 
     <version>3.1</version> 
     <scope>test</scope> 
    </dependency> 
    <!-- Use with cglib to mock classes without default constructor: --> 
    <dependency> 
     <groupId>org.objenesis</groupId> 
     <artifactId>objenesis</artifactId> 
     <version>2.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
    <groupId>org.codehaus.gmavenplus</groupId> 
    <artifactId>gmavenplus-plugin</artifactId> 
    <version>1.5</version> 
</dependency> 
<!-- Power mock dependencies --> 
<dependency> 
<groupId>org.powermock</groupId> 
<artifactId>powermock-module-junit4</artifactId> 
<version>1.5.4</version> 
<scope>test</scope> 
</dependency> 

<dependency> 
<groupId>org.powermock</groupId> 
<artifactId>powermock-module-junit4-rule</artifactId> 
<version>1.5.4</version> 
<scope>test</scope> 
</dependency> 

<dependency> 
<groupId>org.powermock</groupId> 
<artifactId>powermock-classloading-xstream</artifactId> 
<version>1.5.4</version> 
<scope>test</scope> 
</dependency> 
</dependencies> 

<build> 
    <testSourceDirectory>E:\Workspace\Mars\rg\Spock\src\test\groovy</testSourceDirectory> 
<pluginManagement> 
    <plugins> 
     <!-- GMavenPlus plugin --> 
     <plugin> 
      <groupId>org.codehaus.gmavenplus</groupId> 
      <artifactId>gmavenplus-plugin</artifactId> 
      <version>1.5</version> 
      <executions> 
       <execution> 
        <goals> 
        <goal>addSources</goal> 
      <goal>addTestSources</goal> 
      <goal>generateStubs</goal> 
      <goal>compile</goal> 
      <goal>testGenerateStubs</goal> 
      <goal>testCompile</goal> 
      <goal>removeStubs</goal> 
      <goal>removeTestStubs</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
     <!-- Only required if names of spec classes don't match default Surefire patterns (`*Test` etc.) --> 
     <plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.6</version> 
    <configuration> 
     <useFile>false</useFile> 
     <includes> 
     <include>**/*Test*.*</include> 
     <include>**/*Spec*.*</include> 

     </includes> 

中ですフォルダが3つ通過していますが、この静的メソッドテストではエラーが発生しています

When mocking static(BasicMockStaticTest) Time elapsed: 0.104 sec <<< ERROR! 
    java.lang.IllegalStateException: Extension API internal error: org.powermock.api.extension.proxyframework.ProxyFrameworkImpl could not be located in classpath. 
    at org.powermock.modules.junit4.rule.PowerMockClassloaderExecutor.registerProxyframework(PowerMockClassloaderExecutor.java:60) 
    at org.powermock.modules.junit4.rule.PowerMockClassloaderExecutor.forClass(PowerMoc kClassloaderExecutor.java:50) 
    at org.powermock.modules.junit4.rule.PowerMockRule.apply(PowerMockRule.java:31) 
at org.spockframework.runtime.extension.builtin.MethodRuleInterceptor.intercept(MethodRuleInterceptor.java:37) 
at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:87) 
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:59) 
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:120) 
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:103) 
at org.apache.maven.surefire.Surefire.run(Surefire.java:169) 
at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350) 
at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021) 

これらのjunitsをテストするためにmvn testを実行していますが、cglib-nodepのバージョンを3.1から2.2.2に変更しようとしましたが、動作しませんでした。

私はまたpowermock-mockito-リリース-1.5.4-フルが、テストケースのいずれも走っていないとビルドがあったことを追加した後に追加のjarファイルが

powermock-module-junit4-1.5.4 
powermock-module-junit4-common-1.5.4 
powermock-reflect-1.5.4 
powermock-module-junit4-rule-1.5.4 
powermock-classloading-base-1.5.4 
powermock-classloading-xstream-1.5.4 
powermock-api-support-1.5.4 
powermock-core-1.5.4 
groovy-all-2.3.1.jar 
spock-core-1.0-grovy-2.3.jar 

に含まれている以下のJavaビルド・パスでチェック成功しましたが、それは私の意図ではありませんでした。

一部の依存関係が存在しないか、既存のものの一部が競合しているものの、前進できない可能性があります。

何が間違っているかを教えてもらえますか?テストケースに失敗しても前に進むことができますが、私はそれを修正しますが、まずエラーを取り除く必要があります。

私はgroovyMockも試しましたが、静的メソッドのnullpointer例外が発生しました。それから、静的メソッドがgroovyMockで動作しませんでした。

私は人気のあるブログやチュートリアルでトップのGoogleリンクの結果を試しましたが、どれもうまくいかないようです。

+0

なぜあなたは 'DataController'をモックしようとしていますか?これはあなたがテストしたいクラスではありませんか? – tddmonkey

+0

groovymockで解決策を見つけました。はい、間違ったクラスを嘲笑していました。私はサービスクラスを模擬する必要があり、コントローラはサービスクラスメソッドを使用していました。 –

答えて

1

私は(ところで、Javaの静的メソッド、)静的メソッドをテストするために、スポックにGroovyMockを使用しています:

GroovyMock(Foo, global: true) 
Foo.bar(_) >> "my-fake-result" 

私も中に干渉しない、私のモックにスポック、 で私のテストメソッドにこの注釈を追加しました他のテスト:

@ConfineMetaClassChanges([Foo]) 
関連する問題