如何在groovy中使用Spock框架单元测试日志记录错误

Q L*_*Liu 7 groovy logging unit-testing spock

所以我有一个类,它有一个记录消息的方法:

class Car {
    private Logger logger = LoggerFactory.getLogger(Car.class);


    void startCar() {
        logger.error("car stopped working");
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用spock测试框架测试错误是否已记录?

class CarTest extends Specification {
    def "test startCar"() {
        given:
        Car newCar = new Car();

        when:
        newCar.startCar();

        then:
        // HOW CAN I ASSERT THAT THE MESSAGE WAS LOGGED???
    }
}
Run Code Online (Sandbox Code Playgroud)

cfr*_*ick 15

您可以检查记录器上的错误调用

@Grab(group='org.spockframework', module='spock-core', version='0.7-groovy-2.0')
@Grab(group='org.slf4j', module='slf4j-api', version='1.7.7')
@Grab(group='ch.qos.logback', module='logback-classic', version='1.1.2')

import org.slf4j.Logger

class MockLog extends spock.lang.Specification {

    public class Car {
        private Logger logger = org.slf4j.LoggerFactory.getLogger(Car.class);
        void startCar() {
            logger.error('car stopped working');
        }
    }

    def "mock log"() {
    given:
        def car = new Car()
        car.logger = Mock(Logger)
    when:
        car.startCar()
    then:
        1 * car.logger.error('car stopped working')
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:完整示例https://github.com/christoph-frick/spock-test-logging

  • `groovy.lang.ReadOnlyPropertyException:无法设置只读属性:LOG`。在您的示例中,您可以访问 car.logger - 但如果该类不在 Spock Testclass 中,该如何访问? (2认同)

Sve*_*ens 8

我的记录器是私有静态最终的,所以我不能使用上面提到的解决方案,而不是使用反射。

如果您使用 Spring,则可以访问 OutputCaptureRule。

@Rule
OutputCaptureRule outputCaptureRule = new OutputCaptureRule()

def test(){
outputCaptureRule.getAll().contains("<your test output>")
}
Run Code Online (Sandbox Code Playgroud)