单元测试 – 使用Groovy MetaClass覆盖方法
发布时间:2020-12-14 16:34:51 所属栏目:大数据 来源:网络整理
导读:我有一个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 RuntimeExc
我有一个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时,它只是返回“非常groovy”.这样,这个服务就被嘲笑了. 但是我不明白为什么第二种方法,testMetaClass不按预期工作,而是在尝试调用服务对象上的callX时抛出一个NullPointerException异常.我以为我用这一行覆盖了doCallService方法: pojo.metaClass.doCallService = { String s -> 我究竟做错了什么? 谢谢! 解决方法
你的语法是一点点关闭.问题是pojo是一个Java对象,没有一个metaClass.拦截使用ExpandoMetaClass调用PlainOldJavaObject的doCallService:
只需更换: pojo.metaClass.doCallService = { String s -> "no service" } 附: PlainOldJavaObject.metaClass.doCallService = { String s -> "no service" } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |