我正在使用用Groovy編寫的Spock測試來測試一些Java代碼。我使用JMockit來模擬java代碼中的方法,因爲Spock只處理嘲笑的Groovy類。我遇到了測試之間存在JMockit MockUp
的問題。這樣的模擬實例應該只存在於測試中(根據JMockit文檔),但這不起作用,我想這是因爲它沒有使用JMockit測試運行器,而是使用Spock測試運行器。JMockit MockUp堅持Spock測試
這是我面臨的問題的最簡單的例子。我有一個簡單的方法返回一個字符串,我可以用MockUp
更改該方法的返回值,但它仍然存在第三個測試,它不會被使用。
的Java類
public class ClassToTest {
public String method() {
return "original";
}
}
斯波克測試
class ClassToTestSpec extends Specification {
void "first test"() {
when:
String result = new ClassToTest().method()
then:
result == "original"
}
void "second test"() {
setup:
new MockUp<ClassToTest>() {
@Mock
public String method() {
return "mocked"
}
}
when:
String result = new ClassToTest().method()
then:
result == "mocked"
}
void "third test"() {
when:
String result = new ClassToTest().method()
then:
result == "original"
}
}
第三個測試失敗,因爲ClassToTest.method()
仍返回字符串 「嘲笑」,而不是 「原始」。使用調試器我已驗證Mocked方法被調用兩次。
問題
有什麼辦法來手動刪除JMockit類MockUp
?謝謝。
Spock可以模擬Java和Groovy類。嘲笑被測試的班級是一種氣味,應該小心使用。 –
感謝@PeterNiederwieser的迴應,我無法使用正常表示法'instance.method()>> result',你能指出我的方向嗎? – mnd
臨時表示符號工作,我忘了用'Mock'實例化對象,比如'ClassToTest instance = Mock(ClassToTest)'。現在要弄清楚如何使這個部分模擬,可能與間諜。 – mnd