【问题标题】:How to mock methods/functions provided by Traits in Groovy如何在 Groovy 中模拟 Traits 提供的方法/函数
【发布时间】:2016-04-21 04:28:04
【问题描述】:

这是一个例子:

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

class Service implements Sender {

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

    def myMethod2(){

    }
}

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

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

// 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

这些只是我尝试过的一些事情。我什至尝试使用 Mock 框架,例如 Mockito。不幸的是,似乎没有任何效果。有什么建议吗???

【问题讨论】:

  • 好的。我想出了一种使用类别的方法。不过看起来不像是 Groovy 方式... @Category(Service) class MockedService{ def send(String msg){ // 什么都不做 } } use(MockedService){ def service = new Service() service.myMethod1() // 调用 MockedService 中的 send 方法 }
  • 你能解决这个问题吗?除了类别方法。

标签: java unit-testing groovy mocking


【解决方案1】:

尝试使用 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' }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2021-05-02
    • 2011-07-02
    • 2013-11-28
    • 1970-01-01
    相关资源
    最近更新 更多