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