我有一個使用服務做的東西POJO:使用Groovy元類覆蓋方法
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 ->
我在做什麼錯?
謝謝!
這裏要記住的一件事是,當你操作類的metaClass,從這個點向前的每個實例將被操縱。這可能會對同一會話中運行的其他測試產生重大影響。當您操作某個類的實例時,只有該實例受到影響。 – 2013-05-06 15:58:17