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