So I have a class that has a method that logs a message:
class Car {
private Logger logger = LoggerFactory.getLogger(Car.class);
void startCar() {
logger.error("car stopped working");
}
}
How can I test that the error was logged using the spock testing framework?
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???
}
}
you could check for an invocation of error on the logger
@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')
}
}
edit: Full example https://github.com/christoph-frick/spock-test-logging
My Loggers are private static final so I cannot use solution mentioned above and rather not use Reflection.
If you are using Spring, you have acces to OutputCaptureRule.
@Rule
OutputCaptureRule outputCaptureRule = new OutputCaptureRule()
def test(){
outputCaptureRule.getAll().contains("<your test output>")
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With