【发布时间】:2014-07-29 18:27:34
【问题描述】:
我确实有一个像这样的简单课程:
package com.example.howtomocktest
import groovy.util.logging.Slf4j
import java.nio.channels.NotYetBoundException
@Slf4j
class ErrorLogger {
static void handleExceptions(Closure closure) {
try {
closure()
}catch (UnsupportedOperationException|NotYetBoundException ex) {
log.error ex.message
} catch (Exception ex) {
log.error 'Processing exception {}', ex
}
}
}
我想为它写一个测试,这是一个骨架:
package com.example.howtomocktest
import org.slf4j.Logger
import spock.lang.Specification
import java.nio.channels.NotYetBoundException
import static com.example.howtomocktest.ErrorLogger.handleExceptions
class ErrorLoggerSpec extends Specification {
private static final UNSUPPORTED_EXCEPTION = { throw UnsupportedOperationException }
private static final NOT_YET_BOUND = { throw NotYetBoundException }
private static final STANDARD_EXCEPTION = { throw Exception }
private Logger logger = Mock(Logger.class)
def setup() {
}
def "Message logged when UnsupportedOperationException is thrown"() {
when:
handleExceptions {UNSUPPORTED_EXCEPTION}
then:
notThrown(UnsupportedOperationException)
1 * logger.error(_ as String) // doesn't work
}
def "Message logged when NotYetBoundException is thrown"() {
when:
handleExceptions {NOT_YET_BOUND}
then:
notThrown(NotYetBoundException)
1 * logger.error(_ as String) // doesn't work
}
def "Message about processing exception is logged when standard Exception is thrown"() {
when:
handleExceptions {STANDARD_EXCEPTION}
then:
notThrown(STANDARD_EXCEPTION)
1 * logger.error(_ as String) // doesn't work
}
}
ErrorLogger 类中的记录器是由 StaticLoggerBinder 提供的,所以我的问题是 - 我如何使它工作,以便那些检查“1 * logger.error(_ as String)”可以工作?我找不到在 ErrorLogger 类中模拟该记录器的正确方法。我已经考虑过反射并以某种方式访问它,此外还有一个模拟注入的想法(但是如果由于 Slf4j 注释,该类中甚至不存在对对象的引用,如何做到这一点!)提前感谢您的所有反馈和建议。
编辑:这是一个测试的输出,即使 1*logger.error(_) 也不起作用。
Too few invocations for:
1*logger.error() (0 invocations)
Unmatched invocations (ordered by similarity):
【问题讨论】:
-
你试过只用 1*logger.error(_) 吗?如果将输出添加到这些测试中也会很有帮助。
-
我添加了调用。不幸的是, 1*logger.error(_) 也不能正常工作。
-
某些用例(可能是上面的示例)的替代方法是使用docs.groovy-lang.org/next/html/gapi/groovy/lang/…
标签: unit-testing groovy mocking slf4j spock