假设我们有一个要模拟的类。
class Apple {
Color color
bool isFresh
}
我们用 Mock 来模拟它。我们执行需要测试的代码。模拟的 Apple 对象的
Color color
已更新。但是,该字段保持为空。
// test class
Apple apple = Mock(Apple.class)
myService.myMethod(apple)
assert apple.color == Color.RED //FAIL because apple.color == null
// tested code of myMethod(Apple apple)
apple.color = Color.RED
蒂姆和西蒙都是对的。使用模拟时,您应该不会对获得模拟结果感到惊讶,即
null
。
我知道要单独测试
MyService
,你需要模拟Apple
。但是,请验证 setter 上的交互,而不是隐式调用 getter 并期望非空结果。
package de.scrum_master.stackoverflow.q78458317
import spock.lang.Specification
import java.awt.*
class MyServiceTest extends Specification {
def test() {
given:
def myService = new MyService()
Apple apple = Mock(Apple)
when:
myService.myMethod(apple)
then:
1 * apple.setColor(Color.RED)
}
}
class Apple {
Color color
boolean isFresh
}
class MyService {
void myMethod(Apple apple) {
apple.color = Color.RED
}
}
在 Groovy Web Console 中尝试一下。