使用 groovy 中的私有构造函数将闭包映射转换为对象

发布于 2024-10-05 08:26:36 字数 340 浏览 5 评论 0原文

我正在使用 groovy 为测试用例创建一些模拟类。我基本上是在创建虚拟对象,其中所有方法都返回 null,以便我可以运行我的测试用例。

我使用以下语法:

MessageFactory.instance = ["getMessage": {a,b,c,d -> "dummy"}] as MessageFactory

所以在这里我尝试用我的假工厂对象覆盖单例实例。 问题在于 MessageFactory 的构造函数恰好是私有方法。当我运行上面的代码时,这给了我一个非法访问异常。我是否可以在 groovy 中创建代理并克服私有构造函数问题?

I am using groovy to create some mock classes for a test case. I am basically creating dummy objects where all the methods return null so that i can run my testcase.

I am using the following syntax:

MessageFactory.instance = ["getMessage": {a,b,c,d -> "dummy"}] as MessageFactory

So here i am trying to overwrite the singleton instance with my on fake factory object. The problem is that MessageFactory's constructor happens to be a private method. This gives me an illigal access exception when i run the code above. Is there a away i can create a proxy in groovy and overcome the private constructor issue?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

十秒萌定你 2024-10-12 08:26:36

如果您有权访问 MessageFactory 并且愿意修改它,那么您可以使用标准依赖项注入解决方案,如下所示:模拟单例
..虽然它不是特别Groovy

否则,我发现的最好的解决方法是重写单例实例本身的方法,如下所示:

@Singleton
class Test{
    def method(){"Unmocked method called"}
}


def test = Test.instance
test.metaClass.method = {-> null}

test.method() // Now returns null

当然,作为单例,此实例不会改变(至少在理论上)...所以,重写这种方式的方法实际上是全球性的。

编辑:或者您可以使用GMock,它支持构造函数模拟(除其他外)。

If you have access to the MessageFactory, and are willing to modify it, then you use the standard dependency-injection solution, as detailed here: mock singleton
..Though it's not particularly Groovy.

Otherwise, the best workaround I've found is to override the method(s) on the singleton instance itself, like so:

@Singleton
class Test{
    def method(){"Unmocked method called"}
}


def test = Test.instance
test.metaClass.method = {-> null}

test.method() // Now returns null

Naturally, as a singleton, this instance doesn't change (at least in theory)... So, overriding methods in this manner is effectively global.

Edit: Or you can use GMock, which supports constructor mocking (among other things).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文