Как выполнить модульное тестирование конечных точек Spring-Boot REST с MockMVC, где сопоставления путей являются переменными среды? - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь написать модульные тесты для службы, которая сильно зависит от переменных среды для своей конфигурации.Модульные тесты работают нормально для уровня обслуживания, но я сталкиваюсь с проблемами, пытаясь настроить тесты MockMVC для конечных точек, которые считывают свои адреса непосредственно из переменных среды.

Я пытался установить переменную непосредственно в тесте, ноЯ предполагаю, что для заполнения контекста контроллера потребуется прикладной контекст, и я пытаюсь избежать этого для простых модульных тестов.

Использование: Java11, Mockito2, JUnit5, SpringBoot2.2.0.M6

Контроллер:

@RestController
public class OutgoingMessageAPI {

    private MessagingService service;

    public OutgoingMessageAPI(MessagingService service) {
        this.service = service;
    }

    @PostMapping("${MQTT_CLIENT_API_OUTGOING_MESSAGE}")
    public ResponseEntity postMessage(@RequestBody @Valid Message message) {
         service.handleOutgoingMessage(message);
    }

}

Тест, в котором я вручную генерирую тест MockMVC BeforeEach:

@ExtendWith(MockitoExtension.class)
@DisplayName("Outgoing Message API Test")
class OutgoingMessageAPITest {

    private MockMvc mockMvc;

    @Mock
    private ObjectMapper objectMapper;

    @Mock
    private MessagingService messagingService;

    @InjectMocks
    private OutgoingMessageAPI outgoingMessageAPI;

    private Message validIncomingMessage;
    private String validIncomingMessageJSON;

    @BeforeEach
    void beforeEach() throws JsonProcessingException {
        mockMvc = MockMvcBuilders.standaloneSetup(outgoingMessageAPI).build();

        validIncomingMessage = new Message());
        validIncomingMessageJSON = new ObjectMapper().writeValueAsString(validIncomingMessage);
    }

    @Test
    @DisplayName("A valid message is posted")
    void postMessageValid() throws Exception {
        var endpoint = "/endpoint";
        System.setProperty("MQTT_CLIENT_API_OUTGOING_MESSAGE", endpoint);
        mockMvc.perform(post(endpoint)
                    .content(validIncomingMessageJSON)
                    .contentType("application/json"))
                .andExpect(status().isAccepted());
    }

Полученная ошибка:

    Invalid mapping on handler class [com.tlvlp.iot.server.mqtt.client.rpc.OutgoingMessageAPI]: public org.springframework.http.ResponseEntity com.tlvlp.iot.server.mqtt.client.rpc.OutgoingMessageAPI.postMessage(com.tlvlp.iot.server.mqtt.client.persistence.Message)
    Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'MQTT_CLIENT_API_OUTGOING_MESSAGE' in value "${MQTT_CLIENT_API_OUTGOING_MESSAGE}"

1 Ответ

1 голос
/ 26 сентября 2019

В автономной настройке отсутствует поддержка значений заполнителей, встроенных в сопоставления запросов.Поэтому вы должны использовать StandaloneMockMvcBuilder.addPlaceholderValue(...):

@BeforeEach
void beforeEach() throws JsonProcessingException {
    mockMvc = MockMvcBuilders.standaloneSetup(outgoingMessageAPI)
            .addPlaceholderValue("MQTT_CLIENT_API_OUTGOING_MESSAGE", "/endpoint")
            .build();
    ...
}
...