在Groovy中工作如何获得多个Mock?

在Groovy中工作如何获得多个Mock?,groovy,junit,mocking,Groovy,Junit,Mocking,我试图让多个模拟在groovy中工作。我唯一能让它工作的方法就是创建我自己的模拟——添加一个元方法 我尝试过使用嵌套的use语句,也尝试过一次use和一个带有verify的代理,但都不起作用。这两个都返回了一个失败——“junit.framework.AssertionFailedError:此时不再需要调用'pop'。请求结束。” 编辑:重新评论关于模拟从方法构造和返回的内容,我就是这样做的 @Test public void testMockReturned() { MockFor

我试图让多个模拟在groovy中工作。我唯一能让它工作的方法就是创建我自己的模拟——添加一个元方法

我尝试过使用嵌套的use语句,也尝试过一次use和一个带有verify的代理,但都不起作用。这两个都返回了一个失败——“junit.framework.AssertionFailedError:此时不再需要调用'pop'。请求结束。”

编辑:重新评论关于模拟从方法构造和返回的内容,我就是这样做的

@Test
public void testMockReturned() {
    MockFor bubbleMock = new MockFor(SomeService)
    bubbleMock.demand.pop {}
    bubbleMock.use {
        Pupil pupil = new Pupil()
        SomeService service = pupil.blowBubble("red")
        service.pop()
    }
}

在这种情况下,
瞳孔
应该是存根,因为您只使用它来将
泡泡Proxy
注入,您可以对其执行验证。像这样,

    import groovy.mock.interceptor.*
    import org.junit.Test

    class MockTest {
        @Test
        public void testMock() {
            StubFor pupilMock = new StubFor(Pupil)
            MockFor bubbleMock = new MockFor(SomeService)
            GroovyObject bubbleProxy = bubbleMock.proxyInstance()
            pupilMock.demand.blowBubble { String colour ->
                return bubbleProxy
            }
            bubbleMock.demand.pop {}
            bubbleMock.use {
                Teacher teacher = new Teacher()
                teacher.lesson("red")
            }
        }
    }
另外,我相信在调用
proxyInstance()
时,需求会被复制到代理上,因此您需要在实例化代理之前配置需求。 但是,我认为多个模拟没有问题,我认为不能混合使用实例和类模拟(您正在使用
SomeService
)。我能想到的证明这一点的最小例子是

import groovy.mock.interceptor.MockFor

// this works
missyMock = new MockFor(Missy)
missyMock.demand.saySomethingNice {}
missy = missyMock.proxyInstance()
missy.saySomethingNice()
missyMock.verify(missy)

// as does this
missyMock = new MockFor(Missy)
missyMock.demand.saySomethingNice {}
missyMock.use {
    new Missy().saySomethingNice()
}

// this don't
missyMock = new MockFor(Missy)
missyMock.demand.saySomethingNice {}
missy = missyMock.proxyInstance()
missyMock.use {  // fails here in use()'s built-in verify()
    missy.saySomethingNice()
}
missyMock.verify(missy)

class Missy {
    void saySomethingNice() {}
}
为了证明嵌套的
use
闭包的多个模拟是有效的,请看这个人为的示例

import groovy.mock.interceptor.MockFor
import org.junit.Test

class MockTest {
    @Test
    public void testMock() {
        MockFor lessonMock = new MockFor(Lesson)
        MockFor pupilMock = new MockFor(Pupil)
        lessonMock.demand.getLessonPlan {}
        pupilMock.demand.getName {}

        pupilMock.use {
            lessonMock.use {
                Teacher teacher = new Teacher()
                Pupil pupil = new Pupil()
                Lesson lesson = new Lesson()
                teacher.teach(pupil, lesson)
            }
        }
    }
}

class Teacher {
    void teach(Pupil pupil, Lesson lesson) {
        println "Taught ${pupil.getName()} $lesson by ${lesson.getLessonPlan()}"
    }
}

class Pupil {
    String name
}

class Lesson {
    LessonPlan lessonPlan

    static class LessonPlan {}
}

谢谢你,我会记住的。我在非示例代码中使用的场景看起来需要两个mock,所以很高兴能够实现这一点。mock的嵌套样式应该可以根据我搜索的结果工作。当我尝试testMock并添加验证调用(pupilMock.verify())时,我得到的结果是没有调用blowBubble。所有这些看起来都应该是可行的,也许我在代码中有一些错误,我就是看不出来。不,没错。向
对象添加
verify()
调用将无法工作,因为它是存根而不是模拟对象。但实际上,我也有一个错误。。。我们仍然在使用
lesson()
中的真实
Pulpil
对象。你是想让它成为一个类字段还是一个参数?我不知道如何模拟方法中实例化的东西。我可以模拟从@Test public void testMockReturned(){MockFor bubbleMock=new MockFor(SomeService)bubbleMock.demand.pop{}bubbleMock.use{poud poud proud=new poud()SomeService service=studo.blowBubble(“红色”)service.pop()}
import groovy.mock.interceptor.MockFor
import org.junit.Test

class MockTest {
    @Test
    public void testMock() {
        MockFor lessonMock = new MockFor(Lesson)
        MockFor pupilMock = new MockFor(Pupil)
        lessonMock.demand.getLessonPlan {}
        pupilMock.demand.getName {}

        pupilMock.use {
            lessonMock.use {
                Teacher teacher = new Teacher()
                Pupil pupil = new Pupil()
                Lesson lesson = new Lesson()
                teacher.teach(pupil, lesson)
            }
        }
    }
}

class Teacher {
    void teach(Pupil pupil, Lesson lesson) {
        println "Taught ${pupil.getName()} $lesson by ${lesson.getLessonPlan()}"
    }
}

class Pupil {
    String name
}

class Lesson {
    LessonPlan lessonPlan

    static class LessonPlan {}
}