问题描述
我正在尝试测试Spring Boot 2.3 @Controller
,该启动器通过带有@WebMvcTest
的Actuator / Prometheus执行度量。不幸的是,这对于NPE失败,可能是因为测试中不存在Micrometer / Prometheus类。
控制器执行
Counter.builder(COUNTER_STATUS)
.description(DESCRIPTION_STATUS)
.tags(TAG_ACCOUNT,String.valueOf(accountId),TAG_STATUS,String.valueOf(status))
.register(registry)
.increment();
测试有
@ExtendWith(SpringExtension.class)
@ExtendWith(MockitoExtension.class)
@WebMvcTest(HerodotusController.class)
@MockBean(MeterRegistry.class)
private MeterRegistry meterRegistry;
此操作失败,在Counter
行的NPE处;我相信,因为在测试运行时没有该接口的实现(在运行时由io.micrometer:micrometer-registry-prometheus
实现)。
如何在我的测试中实现Micrometer接口的实现,以便其通过?
解决方法
问题出在嘲笑的MeterRegistry
。
NPE发生在这里:
public Counter register(MeterRegistry registry) {
return registry.counter(new Meter.Id(name,tags,baseUnit,description,Type.COUNTER));
}
解决方案是不模拟 MeterRegistry
,而是通过以下方式提供一个
@TestConfiguration
static class AdditionalConfig {
@Bean
public MeterRegistry registry() {
return new SimpleMeterRegistry();
}
}