Я пишу несколько модульных тестов mockMvc для своего привода. В настоящее время у меня есть один для здоровья, который отлично работает

class HealthTest {
  @Autowired
  private Mockmvc mockMvc;

  private ResultActions resultActions;

  @BeforeEach() throws Exception {
    resultActions = mockMvc.perform(get("/actuator/health"));
  }

  @Test
  void shouldReturnOk() throws Exception {
    resultActions.andExpect(jsonPath("status", is("UP")));
  }
}

Это прекрасно работает. Однако, если применить ту же логику к «/actuator/info» (буквально то же самое, что и класс работоспособности, только с изменением этого пути (с конфигурацией, определенной в application.yml, и я просмотрел это вручную, он там, когда я запускаю приложение) мне возвращается статус 200, но нет JSON, хотя сама веб-страница показывает объект JSON.Это как когда я запускаю его через это, он получает обратно пустую страницу, или страницу, но не в json формат.

Изменить: Итак, конфигурация находится в файле main/application.yml. Когда я копирую конфиг в test/application.yml, он работает. Есть ли способ заставить mvc указывать на мой основной application.yml? Поскольку все это действительно тесты, это мой дублированный тестовый конфиг.

Редактировать 2: Лучшее форматирование комментария:

management:
   endpoints:
    web:
     exposure:
     include:
     - info 

info:
 application:
   name: My application name
0
Sheen 4 Фев 2022 в 12:27

2 ответа

/actuator/info предоставляет вашу персонализированную информацию. По умолчанию пустая информация. Следовательно, вы должны создать bean-компонент Spring для предоставления этой информации, например:

import java.util.HashMap;
import java.util.Map;

import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;

@Component
public class BuildInfoContributor implements InfoContributor {

    @Override
    public void contribute(Info.Builder builder) {
        Map<String, String> data = new HashMap<>();
        data.put("version", "2.0.0.M7");
        builder.withDetails(data);
    }
}

И протестируем:

@SpringBootTest
@AutoConfigureMockMvc
class Test {

    @Autowired
    private MockMvc mockMvc;

    private ResultActions resultActions;

    @BeforeEach()
    void setUp() throws Exception {
        resultActions = mockMvc.perform(MockMvcRequestBuilders.get("/actuator/info"));
    }

    @Test
    void shouldReturnOk() throws Exception {
        resultActions.andExpect(jsonPath("version", is("2.0.0.M7")));
    }
}
 
0
Georgy Lvov 4 Фев 2022 в 13:02
Моя информация об приводе в настоящее время работает, только с основным application.yml, имеющим ``` управление: конечные точки: сеть: экспозиция: включает: - информация информация: приложение: имя: имя моего приложения ```
 – 
Sheen
4 Фев 2022 в 13:04
Да, если в вашем тесте/ресурсах есть application.yml, вы должны переопределить все необходимые свойства, включая management.endpoints.web.exposure.include. В противном случае определите с профилем - application-test.yml, тогда все свойства из обоих файлов будут объединены.
 – 
Georgy Lvov
4 Фев 2022 в 14:19

Проблема решена. Получается, что файл тестовых ресурсов не может называться application.yml, ему нужен собственный профиль, либо он полностью переопределяет основной.

0
Sheen 4 Фев 2022 в 13:30