Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 模拟记录器时出现问题_Unit Testing_Grails_Groovy_Mocking_Spock - Fatal编程技术网

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就足够了。谢谢,谢谢。我忽略了这一点@弗朗加西亚