我使用groovy为测试用例创建一些模拟类。我基本上创建虚拟对象,其中所有方法都返回null,以便我可以运行我的测试用例。
我使用以下语法:
MessageFactory.instance = ["getMessage": {a,b,c,d -> "dummy"}] as MessageFactory
所以在这里我试图用我的假工厂对象覆盖单例实例。 问题是MessageFactory的构造函数恰好是私有方法。当我运行上面的代码时,这给了我一个illigal访问异常。有没有我可以在groovy中创建代理并克服私有构造函数问题?
答案 0 :(得分:1)
如果您有权访问MessageFactory并愿意修改它,那么您可以使用标准的依赖注入解决方案,详见此处:mock singleton ..虽然它不是特别 Groovy 。
否则,我发现最好的解决方法是覆盖单例实例本身的方法,如下所示:
@Singleton
class Test{
def method(){"Unmocked method called"}
}
def test = Test.instance
test.metaClass.method = {-> null}
test.method() // Now returns null
当然,作为单身人士,这个实例不会改变(至少在理论上)......所以,以这种方式覆盖的方法实际上是全局的。
编辑或者您可以使用GMock,它支持构造函数模拟(以及其他内容)。