2017-02-28 50 views
1

我正在使用Spock和我的類來測試包裹在Spy中。 我想隔離正在測試的方法,所以我試圖從被測方法中調用其他方法。 通常我會使用這樣的:在Spock對象中使用Spock存在一個void方法

1 * classToTest.methodName(_) >> stubbed_return_value 

我的問題是這樣的:methodName是一種無效的方法。 我嘗試這樣做:

1 * classToTest.methodName(_) 

但實際方法仍稱。

如何使用Spock存儲無效方法?

+0

只是爲了防止任何人像我一樣無知:在Spock中,你不能嘲笑私有方法:他們會像間諜一樣正常運行。我發現Spock的這個「限制」(實際上是因爲它沒有使測試意義)令人驚訝,因爲你可以從你的Spy中調用這些方法(並且似乎嘲笑它們)在你的測試代碼中。如果Spock可以拒絕這個或者將其標記爲錯誤,那麼可能會很好。 –

回答

2

你可以只是null存根它...

考慮下面的Java類:

public class Complex { 
    private final List<String> sideEffects = new ArrayList<>(); 

    protected void sideEffect(String name) { 
     sideEffects.add("Side effect for " + name); 
    } 

    public int call(String name) { 
     sideEffect(name); 
     return name.length(); 
    } 

    public List<String> getSideEffects() { 
     return sideEffects; 
    } 
} 

我們想隱藏sideEffect方法,所以沒有什麼是由它來完成,所以我們可以使用下面的規範:

class ComplexSpec extends Specification { 
    def 'we can ignore void methods in Spies'() { 
     given: 
     Complex complex = Spy() 

     when: 
     int result = complex.call('tim') 

     then: 
     result == 3 
     1 * complex.sideEffect(_) >> null 
     complex.sideEffects == [] 
    } 
}