测试控制器如下
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]}
因此,我想知道为什么一个元替换有效,而另一个则无效?使用元编程无法在两个不同的测试案例中更改相同的方法吗?感谢您的帮助。谢谢!
答案 0 :(得分:0)
我会采用另一种方法:
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
}