我正在开发一个Spring Boot的Java服务,其中包含一个Camel Processor类,如下所示:
public class MyProc implements Processor {
@Autowired
private LogService logService;
public void process(Exchange e) {
// exchange object processing
logService.update(e)
}
}
我有以下的Spock测试:
class MyProcTest extends Specification {
@Shared def logService = Mock(LogService)
@Shared def proc = new MyProc()
def ctx = new DefaultCamelContext()
def exch = new DefaultExchange(ctx)
void setupSpec() {
proc.logService = logService
}
def "log is updated when valid exchange is processed"() {
given:
exch.getIn().setBody(//xml string set on body)
when:
proc.process(exch)
then:
1 * logService.update(_)
}
}
当我运行这个程序时,出现了一个错误,指出1 * logService.update(_)(0次调用)的调用次数太少。我尝试调试代码,在MyProc中,该语句被执行,并且当在Eclipse中突出显示logService对象时,它显示为“Mock for type LogService named $spock_sharedField_logService”,因此看起来mock已经成功注入到MyProc实例中。
我对Spock和Groovy都很陌生,所以可能有些地方理解不正确,但是这个测试不应该通过吗?当运行测试时,mocks方法被调用,所以我不明白为什么测试报告说mocks方法根本没有被调用。我初始化mock/将mock设置在MyProc实例上/设置交互是否不正确?我错过了一些Groovy的特性或警告吗?据我所知,Spock mocks将从调用的方法返回默认值,这很好,我只是想检查proc.process中是否调用了这个特定的方法,并且使用了有效的exchange object。
@Shared
会发生什么?看起来你只实例化了mock一次(通常每个方法都要重置它),但是每次都重新构建上下文。这种不匹配可能会导致问题。 - chrylis -cautiouslyoptimistic-