簡體   English   中英

Spock如何為Java類模擬相同類的方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM