gpt4 book ai didi

unit-testing - 使用 Groovy MetaClass 覆盖方法

转载 作者:行者123 更新时间:2023-12-03 21:09:19 25 4
gpt4 key购买 nike

我有一个使用服务来做某事的 POJO:

public class PlainOldJavaObject {

private IService service;

public String publicMethod(String x) {
return doCallService(x);
}

public String doCallService(String x) {
if(service == null) {
throw new RuntimeException("Service must not be null");
}
return service.callX(x);
}

public interface IService {
String callX(Object o);
}
}

我有一个 Groovy 测试用例:
class GTest extends GroovyTestCase {

def testInjectedMockIFace() {
def pojo = new PlainOldJavaObject( service: { callX: "very groovy" } as IService )
assert "very groovy" == pojo.publicMethod("arg")
}

def testMetaClass() {
def pojo = new PlainOldJavaObject()
pojo.metaClass.doCallService = { String s ->
"no service"
}
assert "no service" == pojo.publicMethod("arg")
}
}

第一种测试方法, testInjectedMockIFace按预期工作:POJO 是使用 IService 的动态实现创建的.当 callX被调用,它只是返回“非常常规”。这样,服务就被模拟出来了。

但是我不明白为什么是第二种方法, testMetaClass没有按预期工作,而是在尝试调用时抛出 NullPointerException callX在服务对象上。我以为我已经覆盖了 doCallService使用这一行的方法:
pojo.metaClass.doCallService = { String s ->

我究竟做错了什么?

谢谢!

最佳答案

你的语法有点偏离。问题是 pojo 是一个 Java 对象并且没有元类。使用 ExpandoMetaClass 拦截对 PlainOldJavaObject 的 doCallService 的调用:

只需更换:

    pojo.metaClass.doCallService = { String s ->
"no service"
}

和:
    PlainOldJavaObject.metaClass.doCallService = { String s ->
"no service"
}

关于unit-testing - 使用 Groovy MetaClass 覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1927796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com