繁体   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