小编Mas*_*ile的帖子

@SpringbootTest 中缺少 /actuator/prometheus

我正在使用 springboot 2.4.0,并添加了以下依赖项以启用 prometheus 指标:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

然后在我的 application.properties 我有以下属性

management.endpoints.web.exposure.include=*
management.metrics.enable.all=true
Run Code Online (Sandbox Code Playgroud)

我正在尝试运行一个简单的集成测试,以查看我的自定义指标出现在 /actuator/prometheus 端点上。代码下方

package com.example.demo;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.web.server.LocalServerPort;
import static io.restassured.RestAssured.given;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class IntegrationTest {

  @LocalServerPort
  private int port;

  private String baseUrl;

  @BeforeEach
  public void setup() {
      baseUrl = "http://localhost:" + port;
  }

  @Test
  public void metricsEndpoint() throws Exception {

    given().when().get(baseUrl + "/demo/actuator/prometheus")
            .then()
            .statusCode(200);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里得到的错误是

java.lang.AssertionError: 1 expectation failed.
Expected status …
Run Code Online (Sandbox Code Playgroud)

java metrics spring-boot-actuator spring-boot-test spring-micrometer

17
推荐指数
3
解决办法
1508
查看次数

使用整个上下文运行其他测试时未注入 Springboot @MockBean

当尝试在 Junit 测试中注入带有注释 @MockBean 的 bean 时,我遇到了一些问题。结果,我得到了注入的真实服务,而不是模拟的服务,但奇怪的行为是,这只在使用 Maven verify 运行测试(与其他集成测试一起)时才会发生。

基本上,我想要模拟的 bean 被注入到监听器 (@Component) 中,该监听器由集成测试期间在队列上发送的消息触发。当侦听器运行时,其中的服务是真实的服务,而不是模拟的服务。

在我看来,当运行其他测试时,真正的bean之前被注入到上下文中,而@MockBean虽然应该重新启动spring上下文,但当遇到相同的bean时,不会用模拟的bean替换现有的bean类型。

这确实是一个奇怪的行为,因为文档说“上下文中定义的任何现有的相同类型的单个 bean 将被模拟替换”。好吧,这并没有发生。

下面您可以找到显示这是如何完成的片段。

要嘲笑的服务是:

@Slf4j
@Service
@Transactional
public class SomeServiceImpl implements SomeService {
   
   @Override
   @Async
   public void doStuff(){
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

像这样注入我的服务的侦听器

@Slf4j
@Component
@Transactional
public class SagaListener {
    
    @Autowired
    private SomeService someService;
    
    @JmsListener(destination = "${mydestinationtopic}", containerFactory = "myFactory",
    subscription = "my-subscription", selector = "eventType = 
    'MY_EVENT'" )
    public void receive(MyEventClass event) {
        someService.doStuff();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试课

@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class SagaListenerIT …
Run Code Online (Sandbox Code Playgroud)

java integration-testing mocking spring-boot spring-context

6
推荐指数
0
解决办法
3306
查看次数