Я пишу несколько модульных тестов 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
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")));
}
}
Проблема решена. Получается, что файл тестовых ресурсов не может называться application.yml
, ему нужен собственный профиль, либо он полностью переопределяет основной.
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].
application.yml
, вы должны переопределить все необходимые свойства, включаяmanagement.endpoints.web.exposure.include
. В противном случае определите с профилем -application-test.yml
, тогда все свойства из обоих файлов будут объединены.