我做了一个示例Spring启动应用程序,用于向Hosted Graphite发送指标。为此我添加了一个Metrics Manager类。
@Component
public class MetricsManager {
@Autowired
private MetricRegistry metricsRegistry;
private GraphiteReporter reporter;
/**
* Method connects Boot project with graphite server to push the metrics
* data. It registers with graphite server only if the graphite
* information(hostname, port) is available.
*
* Property ‘graphiteConfigParams’ should be configured in following format.
*/
@PostConstruct
public void registerGraphiteReporter() {
try {
final Graphite graphite = new Graphite(new InetSocketAddress("<url>", <port>));
reporter = GraphiteReporter.forRegistry(metricsRegistry)
.prefixedWith("service.testing")
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.SECONDS)
.filter(new FilterMetrics()).build(graphite);
reporter.start(30 , TimeUnit.SECONDS);
}
@PreDestroy
public void destropMetricsContext() {
if (reporter != null)
reporter.stop();
}
}
因此,当应用程序运行时,指标可以正常导出。
以下是控制器类
控制器类
@RestController
public class HelloController {
@GetMapping("/hello")
String hello() {
return "hello";
}
}
当我为这个Hello控制器运行测试时,在应用程序上下文加载时遇到异常,
测试类
@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
@ComponentScan({"com.metric.test"})
public class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testMalformedRequest() throws Exception{
System.err.println("");
}
}
我收到以下异常
申请失败
说明
com.metric.test.manager.MetricsManager中的字段metricsRegistry需要一个类型为'com.codahale.metrics.MetricRegistry&#39;的bean。无法找到。
动作:
考虑定义类型为'com.codahale.metrics.MetricRegistry&#39;的bean。在你的配置中。
因此,当我创建配置类并将其定义为bean时,测试通过正常。
@Configuration
public class ServiceConfig {
@Bean
public MetricRegistry getMetricsRegistry(){
return new MetricRegistry();
}
}
我的问题是
请告诉我为什么只在运行junits时抛出异常?即使应用程序运行时自动布线工作正常,也无需在配置中进行定义。