在Groovy中模拟单例

在Groovy中模拟单例,groovy,spock,Groovy,Spock,在Groovy/Spock中,我可以通过执行以下操作来模拟类: def theClass = Mock(TheClass.class) 然后将该实例连接到单元测试下的类中。如果我想模拟一个被注释为@Singleon的类,你可以使用它 def publisher=new publisher() publisher您可以使用 def publisher=new publisher() publisher这里有一个您可以使用的小工具类: package de.scrum\u master.stack

在Groovy/Spock中,我可以通过执行以下操作来模拟类:

def theClass = Mock(TheClass.class)
然后将该实例连接到单元测试下的类中。如果我想模拟一个被注释为@Singleon的类,你可以使用它

def publisher=new publisher()
publisher您可以使用

def publisher=new publisher()

publisher这里有一个您可以使用的小工具类:

package de.scrum\u master.stackoverflow
导入java.lang.reflect.Field
导入java.lang.reflect.Modifier
类GroovySingletonTool{
私人课堂
GroovySingletonTool(clazz类){
this.clazz=clazz
}
void setSingleton(T实例){
//使“实例”字段为非最终字段
Field=clazz.getDeclaredField(“实例”)
field.modifiers&=~Modifier.FINAL
//只有在以前未设置singleton实例时才有效
field.set(clazz.instance,instance)
}
void singleton(){
setSingleton(空)
}
void重新初始化Singleton(){
//取消设置singleton实例,否则后续构造函数调用将失败
单子()
setSingleton(clazz.newInstance())
}
}
只需调用
setSingleton(Mock(类))
。有关更多信息,请参阅,我不想在这里重复整个示例代码


如果您有任何不明白的地方,请随时提出后续问题。

这里有一个您可以使用的小工具类:

package de.scrum\u master.stackoverflow
导入java.lang.reflect.Field
导入java.lang.reflect.Modifier
类GroovySingletonTool{
私人课堂
GroovySingletonTool(clazz类){
this.clazz=clazz
}
void setSingleton(T实例){
//使“实例”字段为非最终字段
Field=clazz.getDeclaredField(“实例”)
field.modifiers&=~Modifier.FINAL
//只有在以前未设置singleton实例时才有效
field.set(clazz.instance,instance)
}
void singleton(){
setSingleton(空)
}
void重新初始化Singleton(){
//取消设置singleton实例,否则后续构造函数调用将失败
单子()
setSingleton(clazz.newInstance())
}
}
只需调用
setSingleton(Mock(类))
。有关更多信息,请参阅,我不想在这里重复整个示例代码


如果您有什么不明白的地方,请随时提出后续问题。

您为什么要嘲笑单身汉?我从来没有看到这样做的好理由。我正在对一个特定的类进行单元测试。它从singleton调用一个API,singleton启动并从解析一组文件中获取一组数据,然后返回一个对象列表。我只想把返回的物品清单删掉。你接受了莱纳德的答案。为什么?它不起作用。你能告诉我你是怎么做的吗?我试图复制他的解决方案,但它对实际访问
MySingleton.instance
的代码不起作用。那不是你的用例吗?为此,我需要使用我的helper类来显式地更改singleton实例?我从来没有看到这样做的好理由。我正在对一个特定的类进行单元测试。它从singleton调用一个API,singleton启动并从解析一组文件中获取一组数据,然后返回一个对象列表。我只想把返回的物品清单删掉。你接受了莱纳德的答案。为什么?它不起作用。你能告诉我你是怎么做的吗?我试图复制他的解决方案,但它对实际访问
MySingleton.instance
的代码不起作用。那不是你的用例吗?为此,我需要使用我的helper类显式地更改singleton实例。我认为这不起作用,因为
RealSubscriber.instance
将为null。此外,全局模拟只适用于Groovy类。如果
Publisher
是一个Java类呢?这个问题只有groovy和spock标记,所以我假设所讨论的代码是groovy代码。如果目标被java代码使用,它将不起作用。也许你没有领会我的意思。由于tobemocked类中的
@Singleton
注释,它不能与100%Groovy代码一起工作。引用类试图通过
MySingleton.instance
访问它,但失败了,因为它没有获得全局Groovy mock,而是原始对象。所以我认为我的helper类没有简单的方法。我认为这不起作用,因为
RealSubscriber.instance
将为空。此外,全局模拟只适用于Groovy类。如果
Publisher
是一个Java类呢?这个问题只有groovy和spock标记,所以我假设所讨论的代码是groovy代码。如果目标被java代码使用,它将不起作用。也许你没有领会我的意思。由于tobemocked类中的
@Singleton
注释,它不能与100%Groovy代码一起工作。引用类试图通过
MySingleton.instance
访问它,但失败了,因为它没有获得全局Groovy mock,而是原始对象。所以我认为在我的助手课上没有简单的方法。
def publisher = new Publisher()
publisher << new RealSubscriber() << new RealSubscriber()

def anySubscriber = GroovyMock(RealSubscriber, global: true)

when:
publisher.publish("message")

then:
2 * anySubscriber.receive("message")