测试 Controller 如下
def justTest(){
def res = paymentService.justTest()
[status: res.status]
}
测试服务方法如下
def justTest(){
}
现在,这两个测试用例如下。两种情况下都修改了付款服务方法justTest来返回两个不同的值。
@Test
void test1(){
PaymentService.metaClass.justTest = {['status': true]}
def res = controller.justTest()
assertEquals(res.status, true)
GroovySystem.metaClassRegistry.removeMetaClass(PaymentService.class)
}
第二次测试如下
@Test
void test2(){
PaymentService.metaClass.justTest = {['status': false]}
def res = controller.justTest()
assertEquals(res.status, false)
GroovySystem.metaClassRegistry.removeMetaClass(PaymentService.class)
}
一项测试失败。当我使用调试器时,我注意到此替换无效
PaymentService.metaClass.justTest = {['status': true]}
因此,我想知道为什么一个元替换有效,而另一个则无效?使用元编程无法在两个不同的测试案例中更改相同的方法吗?感谢您的帮助。谢谢!
最佳答案
我会采取另一种方法:
void test1(){
controller.paymentService = new PaymentService() {
def justTest() {['status': true]}
}
def res = controller.justTest()
assertEquals(res.status, true)
}
或者,如果您使用Spock而不是JUnit:
void test1() {
controller.parymentService = Stub() {
justTest() >> [status: true]
}
// ... other code
}
关于grails - 元替换两个不同的测试中的相同方法不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55508397/