Unit testing 模拟记录器时出现问题
我在模拟类的日志字段时遇到了一个奇怪的问题。运行同一测试两次,第二次显示错误。这是一个代码示例:Unit testing 模拟记录器时出现问题,unit-testing,grails,groovy,mocking,spock,Unit Testing,Grails,Groovy,Mocking,Spock,我在模拟类的日志字段时遇到了一个奇怪的问题。运行同一测试两次,第二次显示错误。这是一个代码示例: class AccountConfigJSON { static Logger log = Logger.getLogger(AccountConfigJSON.class) def AccountConfigJSON(String jsonString) { if (jsonString) { json = new JSONObject(j
class AccountConfigJSON {
static Logger log = Logger.getLogger(AccountConfigJSON.class)
def AccountConfigJSON(String jsonString) {
if (jsonString) {
json = new JSONObject(jsonString)
} else {
log.debug("No JSON string for account config. Will not parse")
}
}
}
这就是规格
class AccountConfigJSONUnitSpec extends UnitSpec {
def loggerMock
def setup(){
loggerMock = Mock(org.apache.log4j.Logger)
org.apache.log4j.Logger.metaClass.static.getLogger = { Class clazz -> loggerMock }
}
def 'If jsonString is null, a log is written'(){
when:
new AccountConfigJSON("")
then:
1 * loggerMock.debug("No JSON string for account config. Will not parse")
}
def 'If jsonString is empty, a log is written'(){
when:
new AccountConfigJSON("")
then:
1 * loggerMock.debug("No JSON string for account config. Will not parse")
}
}
第二次测试失败
| Too few invocations for:
1 * loggerMock.debug("No JSON string for account config. Will not parse") (0 invocations)
但是使用Idea调试应用程序,显然它运行了这句话。有什么想法吗?看起来很奇怪,实际的调用已经执行,但没有记录中的交互。您可以通过显式地将模拟记录器分配给类来解决此问题,如下所示:
def setup(){
loggerMock = Mock(org.apache.log4j.Logger)
AccountConfigJSON.log = loggerMock
}
从“交互”的定义来看,我认为上述设置是最好的方式
交互仅仅是常规方法调用吗?
不完全是。而交互看起来类似于常规方法
调用,它只是一种表示方法调用的方式
预计会发生。思考互动的一个好方法是将其视为
对模拟对象的所有传入调用都是
对抗。根据具体情况,可能会发生交互
匹配零次、一次或多次调用
这仅在处理类中的
静态
对象属性时发生。当logger在测试的类中被定义为非静态时,一切都会按照预期工作,而无需进行变通。我已经编辑了答案,基本上删除了logger类上的元编程。仅将AccountConfigJSON.log分配给LoggerLock就足够了。谢谢,谢谢。我忽略了这一点@弗朗加西亚