2015-12-06 27 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()的區別是因爲它是在Java String類中定義的,而不是Groovy版本?這[回答](http://stackoverflow.com/a/12177035/369722)似乎是這樣建議的。 –