[英]Spock how to mock a method of the same class for a Java class
我有一個Java課
class MyClass {
void methodA() {
//something
}
void methodB() {
//something else
}
}
我想對方法A進行單元測試,但方法A取決於方法B。 我已經閱讀了Spock文檔,但是找不到如何處理這種情況。 我該怎么辦?
請注意,我無法為此找到答案,因此我正在根據stackoverlfow的自我回答策略自行回答關於stackoverflow的問題。 添加了此注釋,以避免對那些不了解自回答策略的用戶造成混淆,因此請勿刪除。
這是一種無需模擬即可覆蓋所需方法的方法:
def "your spock test"() {
MyClass myClass = new MyClass() {
@Override
void methodB() {
// do something related to this test
}
}
expect:
//whatever you want to do
myClass.methodA()
}
它實際上是在spock文檔中記錄的,請參閱部分模擬一節。
// this is now the object under specification, not a collaborator
def persister = Spy(MessagePersister) {
// stub a call on the same object
isPersistable(_) >> true
}
when:
persister.receive("msg")
then:
// demand a call on the same object
1 * persister.persist("msg")
一種解決方案是在測試中執行以下操作
def "your spock test"() {
MyClass myClass = Mock(MyClass)
myClass.methodA() >> {
callRealMethod()
}
myClass.methodB() >> {
//your mocking logic
}
expect:
//whatever you want to do
}
通過spock進行模擬時,可以使用callRealMethod調用實際的實現。
我會重新考慮一下該解決方案,因為您在這里所做的是測試模擬而不是實際對象 。 在本課程中,我不會嘲笑任何東西,為了簡單起見,我會將其視為一個單元。 如果methodB
代表不同的單位范圍則methodA
那么也許這是重構這一類,並提取封裝的責任一個很好的起點methodB
以注入你想測試一個單獨的類。 在我看來,嘲笑這個注入的類更有意義。 但是首先要問自己,為什么要模擬以及是否還有更好的選擇(模擬應該是您值得考慮的最后選擇)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.