我有一个使用服务做某事的 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
不能按预期工作,而是在尝试调用callX
服务对象时抛出 NullPointerException。我以为我已经doCallService
用这一行覆盖了该方法:
pojo.metaClass.doCallService = { String s ->
我究竟做错了什么?
谢谢!