Я пытаюсь написать модульные тесты для службы, которая сильно зависит от переменных среды для своей конфигурации.Модульные тесты работают нормально для уровня обслуживания, но я сталкиваюсь с проблемами, пытаясь настроить тесты 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}"