Spring Boot 我有一个Sping Boot 单元测试代码,它使用方法链构建了一个Timer,我如何在测试期间处理/绕过它?

iovurdzv  于 2023-06-22  发布在  Spring
关注(0)|答案(1)|浏览(114)

测试类包含以下方法:

protected void recordRepositoryInvocationMetrics(Method method, Object target, long queryDuration) {
    Timer.builder("mysql.call.duration")
         .description("MySqL Database call Duration")
         .tag("method.name", target.getClass().getSimpleName() + "." + method.getName())
         .tag("service.name", context.getId() != null ? context.getId() : "unknown")
         .register(meterRegistry)
         .record(queryDuration, TimeUnit.MILLISECONDS);
}

为了让这个测试成功我头疼不已。
如何绕过/处理此方法?
我可以重组这段代码,使它更容易被模仿吗?

yeotifhr

yeotifhr1#

解决方案是使用"partial mock",将@Spy注解添加到被测类中,如下所示:

@InjectMocks
@Spy
private RepositoryMetricsInvocationAspect aspect;

在测试中,我可以这样做:

doNothing().when(aspect).recordRepositoryInvocationMetrics(any(Method.class), any(Object.class), anyLong());

方法仍然会被调用,但其中的代码不会被执行。这允许我在不执行静态Timer方法的情况下测试类的逻辑。

相关问题