如何模拟Groovy中的Traits提供的方法/函数

这是一个例子:

trait Sender {
    def send(String msg){
        // do something
    }
}

class Service implements Sender {

    def myMethod1(){
        send('Foo')
        myMethod2()
    }

    def myMethod2(){

    }
}

我正在尝试测试Service类.但是,我想存根/模拟对特征(发送)提供的方法调用

我已经尝试了几种不同的方法来存根/模拟方法发送,但没有成功:

// 1
Service.Metaclass.send = { String s -> // do nothing }

// 2
def service = new MyService()
service.MetaClass.send = { String s -> // do nothing }

// 3
StubFor serviceStub = new StubFor(Service.class)
serviceStub.demand.send { String s -> // do nothing }

// 
trait MockedSender {
  def send(String msg) { // do nothing }  
}
def service = new Service() as MockedSender

这些只是我尝试过的一些事情.我甚至尝试使用像Mockito这样的模拟框架.不幸的是,似乎没有任何效果.有什么建议???

解决方法

尝试使用Spock框架中的 Spy

像这样:

trait Sender {
    def send(String msg){
        println msg
    }
}

class Service implements Sender {

    def myMethod1(){
        send('Foo')
        myMethod2()
    }

    def myMethod2(){
        println 'real implementation'
    }
}

class UnitTest extends Specification {

    def "Testing spy on real object"() {
        given:
        Service service = Spy(Service)
        when:
        service.myMethod1()
        then: "service.send('Foo') should be called once and should print 'mocked' and 'real implementation' on console"
        1 * service.send('Foo') >> { println 'mocked' }
    }
}

相关文章

背景:    8月29日,凌晨4点左右,某服务告警,其中一个...
https://support.smartbear.comeadyapi/docs/soapui/steps/g...
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能...
Scala和Java为静态语言,Groovy为动态语言Scala:函数式编程,...
出处:https://www.jianshu.com/p/ce6f8a1f66f4一、一些内部...
在运行groovy的junit方法时,报了这个错误:java.lang.Excep...