加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

单元测试 – 使用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"
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读