junit MeterRegistry计数器测试用例失败

8zzbczxx  于 2022-11-11  发布在  其他
关注(0)|答案(3)|浏览(273)

我已经通过注入MeterRegistry和如下所示的递增计数在我的服务中实现了Micrometer Prometheus计数器,并且我还编写了一个测试用例,但是当我运行该测试用例时,我得到:
“Java.lang.空指针异常:无法调用“io. micronium.core.instrument.MeterRegistry.counter(String,String[])”,因为“此.meterRegistry”为空”。
服务文件:

@Autowired
private MeterRegistry meterRegistry;

public void counterIncrement() { 
    meterRegistry.counter("test_count").increment();
}

测试用例文件:

@MockBean
private MeterRegistry registry;

@Test
void testCounter() {
    //  invoking counterIncrement();
}
7cjasjjr

7cjasjjr1#

如何创建测试中的类?由于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();
  }
a0x5cqrl

a0x5cqrl2#

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

kgsdhlau

kgsdhlau3#

根据测试和服务的不同,有几种方法可以处理丢失的MeterRegistry。
1.如果您在测试中使用Spring上下文,请尝试使用use a test configuration创建MeterRegistry bean。
1.如果您的测试使用一些Mock框架,您可以通过@Hans-Christian将MeterRegistry模拟为suggested
1.如果你只是简单地将成员meterRegistry设置为非私有的,你可以在一些设置方法中将其设置为SimpleMeterRegistry,并按照注解中的@checketts的建议用@BeforeEach进行注解。
1.如果模拟 Jmeter 注册表变得复杂,您可以轻松地构建和使用一些提供注册表的工厂,并模拟该工厂。一个非常简单的工厂就可以做到,例如,一个spring @Component,它带有一个自动连接的MeterRegistry和一些用于工厂的公共getter。
1.您可以使用工厂方法模式as described in wikipedia来获取MeterRegistry,覆盖服务子类中的工厂方法,并在测试中使用此子类。(注意,四人组确实使用了static factory method,您将需要一个非静态方法。)
我更喜欢方案3,但在适当的时候会使用方案1。我添加了方案4和5,只是因为可能有一些额外的原因和特殊情况使这些方案成为一个好的选择。如果是这样,我更喜欢4而不是5。

相关问题