【发布时间】:2010-12-28 00:29:27
【问题描述】:
我有一个使用服务做某事的 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 ->
我做错了什么?
谢谢!
【问题讨论】:
标签: unit-testing programming-languages groovy mocking dynamic-languages