2015-12-06 7 views
6

モックファイナルクラスをスポークできますか?もしそうなら、どうですか?検索結果はgistとなっていますが、これは暗示しているようですが、そうした例は見つかりません。私はまた最終的なクラスを模擬することがサポートされていないと言うフォーラムの記事を見つけました。Spockのモックファイナルクラス

+0

場合によっては、Groovyで試してみるのが一番です。 – cjstehno

+0

@cjstehno私は試して、例外があります。しかし、私はそれについて私が知らない特別な方法があるかもしれないと考えました。 –

+0

私の答えは問題を解決しますか? – Opal

答えて

14

この仕様:

@Grab('org.spockframework:spock-core:1.0-groovy-2.4') 
@Grab('cglib:cglib-nodep:3.1') 

import spock.lang.* 

class Test extends Specification { 
    def 'lol'() { 
     given: 
     def s = Mock(String) { 
      size() >> 10 
     } 

     expect: 
     s.size() == 10   
    } 
} 

は、次の例外で終了します。

JUnit 4 Runner, Tests: 1, Failures: 1, Time: 29 Test Failure: 
lol(Test) org.spockframework.mock.CannotCreateMockException: 
Cannot create mock for class java.lang.String because Java mocks cannot mock final classes. 
If the code under test is written in Groovy, use Groovy mock. 

ソリューションはGroovyMockを使用することです:うまく機能

@Grab('org.spockframework:spock-core:1.0-groovy-2.4') 
@Grab('cglib:cglib-nodep:3.1') 

import spock.lang.* 

class Test extends Specification { 
    def 'lol'() { 
     given: 
     def s = GroovyMock(String) { 
      size() >> 10 
     } 

     expect: 
     s.size() == 10   
    } 
} 

+0

String.length()でこれがなぜ機能しないのでしょうか? –

+0

String.length()との違いは、Groovyのバージョンではなく、Java Stringクラスで定義されているためですか?この[回答](http://stackoverflow.com/a/12177035/369722)はそう示唆しているようです。 –