【问题标题】:MeterRegistry counter test case failingMeterRegistry 计数器测试用例失败
【发布时间】:2022-08-11 20:32:33
【问题描述】:

我通过注入 MeterRegistry 并增加计数在我的服务中实现了微表 Prometheus 计数器,如下所示,我也编写了一个测试用例,但是当我运行测试用例时,我得到了

\"java.lang.NullPointerException:无法调用 \“io.micrometer.core.instrument.MeterRegistry.counter(字符串, String[])\" 因为 \"this.meterRegistry\" 为空\"。

请有人帮忙

服务文件:

    @Autowired
    private MeterRegistry meterRegistry;
    
    public void counterIncrement()
    { 
    meterRegistry.counter(\"test_count\").increment();
    }

测试用例文件:

    @MockBean
    private MeterRegistry registry;
     
    @Test
    void testCounter()
   {
    //  invoking counterIncrement();
    }
  • 您可以实例化 SimpleMeterRegistry 进行测试。

标签: spring-boot junit micrometer spring-micrometer


【解决方案1】:

根据您使用的 junit 版本,您需要将注释添加到您的测试类。 Junit 5:@ExtendWith(MockitoExtension.class) 或 Junit 4:@RunWith(MockitoJUnitRunner.class)

【讨论】:

    【解决方案2】:

    你如何创建你的测试类? 由于 registry 从未实例化,因此您设置测试的方式似乎有些问题。

    检查您是否以正确的方式使用@MockBean。这将替换应用程序上下文中的 bean,如果您没有在测试中启动 spring 上下文,它将无法工作。有关更多信息,请参阅this 帖子

    另一种方法是使用@Mock 并在构造函数中注入注册表,例如:

    @ExtendWith(MockitoExtension.class)
    public class MyServiceTest {
    
      @Mock
      private MeterRegistry registry;
    
      private MyService myService;
    
      @BeforeEach
      void setup() {
        myService = new MyService(registry);
      }
    
      @Test
      void testCounter() {
        var counter = mock(Counter.class);
        given(registry.counter(any(String.class))).willReturn(counter);
        myService.counterIncrement();
      }
    

    【讨论】:

      【解决方案3】:

      根据测试和服务,有几种方法可以处理丢失的 MeterRegistry。

      1. 如果您在测试中使用弹簧上下文,请尝试使用use a test configuration 创建 MeterRegistry bean。
      2. 如果您的测试使用了一些 Mock 框架,您可以将 MeterRegistry 模拟为 @Hans-Christian 的 suggested
      3. 如果您只是将成员meterRegistry 设为非私有。您可以按照@checketts in the comments 的建议,以某种设置方法将其设置为SimpleMeterRegistry,并使用@BeforeEach 进行注释。
      4. 如果模拟仪表注册表变得复杂,您可以轻松构建和使用一些提供注册表的工厂并模拟该工厂。一个非常简单的工厂就可以了,例如一个弹簧@Component,带有自动接线的 MeterRegistry 和工厂的一些公共吸气剂。
      5. 您可以使用工厂方法模式as described in wikipedia 来获取 MeterRegistry,在您的服务的子类中覆盖工厂方法并在测试中使用该子类。 (请注意,四人组确实使用了static factory method,您需要一个非静态方法。)

        我赞成解决方案 3,但会在适当的时候使用解决方案 1。我添加了解决方案 4 和 5 只是因为可能有一些额外的原因和特殊情况使这些解决方案成为一个不错的选择。如果是这样,我更喜欢 4 而不是 5。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-29
        • 2018-12-02
        • 1970-01-01
        • 1970-01-01
        • 2022-10-07
        • 2016-08-28
        • 2020-12-15
        • 1970-01-01
        相关资源
        最近更新 更多