У меня есть приложение Spring-Boot 1.5.21, которое служит REST-шлюзом между Angular UI и внешним API, который предоставляет данные (длинный рассказ - действует как авторизация между UI и источником данных). Запрос поступает в приложение Spring-Boot, оно вызывает API источника данных с полезной нагрузкой запроса.
Я новичок в модульном тестировании для Spring-Boot и пытаюсь написать тест для метода POST REST в приложении Gateway, которое создает новую запись (create). Я прочитал несколько учебных пособий и других веб-сайтов, в которых подробно рассказывается о модульном тестировании API-интерфейсов Spring-Boot, но ничего, что могло бы помочь мне в моей ситуации.
Я хочу:
- Модульное тестирование метода REST Controller и проверка правильности @RequestBody
- Я не хочу, чтобы запись создавалась в источнике данных
Метод контроллера:
@PostMapping(value = "/" + Constants.API_CHANGE_REQUEST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public String submitChangeRequest(@RequestBody ChangeRequestWrapper changeRequestWrapper) {
logger.info("API Request: Posting Change Request: " + changeRequestWrapper.toString());
return restService.makeApiPost(sharedDataService.buildApiUrlPath(Constants.API_CHANGE_REQUEST), changeRequestWrapper);
}
AppConfig:
@PropertySource({"classpath:application.properties"})
@Configuration
public class AppConfig {
@Resource
private Environment env;
@Bean
public RestTemplate restTemplate() {
RestTemplateBuilder builder = new RestTemplateBuilder();
return builder
.setConnectTimeout(Constants.API_TIMEOUT_CONNECT)
.setReadTimeout(Constants.API_TIMEOUT_READ)
.basicAuthorization(env.getProperty("bpm.user"), env.getProperty("bpm.password"))
.build();
}
}
RestServiceImpl:
@Service
public class RestServiceImpl implements RestService {
private static final Logger logger = LoggerFactory.getLogger(RestServiceImpl.class);
@Autowired
private RestTemplate myRestTemplate;
@Value("${bpm.url}")
private String restUrl;
public String getApiUri() {
return restUrl;
}
public String makeApiCall(String payload) /*throws GradeAdminException */{
logger.info("Implementing API call.");
logger.debug("userApi: " + payload);
return myRestTemplate.getForObject(payload, String.class);
}
public String makeApiPost(String endpoint, Object object) {
logger.info("Implementing API post submission");
logger.debug("userApi endpoint: " + endpoint);
return myRestTemplate.postForObject(endpoint, object, String.class);
}
}
SharedDataServiceImpl:
@Service
public class SharedDataServiceImpl implements SharedDataService {
@Autowired
private RestService restService;
@Override
public String buildApiUrlPath(String request) {
return buildApiUrlPath(request, null);
}
@Override
public String buildApiUrlPath(String request, Object parameter) {
String path;
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(restService.getApiUri());
if (parameter != null) {
builder = builder.path(getApiPath(request) + "/{object}");
UriComponents buildPath = builder.buildAndExpand(parameter);
path = buildPath.toUriString();
} else {
builder = builder.path(getApiPath(request));
path = builder.build().toUriString();
}
return path;
}
}
Что я сделал для методов GET:
@RunWith(SpringRunner.class)
@WebMvcTest(ClientDataRequestController.class)
@ContextConfiguration(classes = { TestConfig.class }, loader = AnnotationConfigWebContextLoader.class)
public class ClientDataRequestControllerTest {
@Autowired
private MockMvc mvc;
@Before
public void setUp() {
}
@Test
public void test_no_endpoint() throws Exception {
this.mvc.perform(get("/")).andExpect(status().isNotFound()).andReturn();
}
@Test
public void test_controller_no_endpoint() throws Exception {
this.mvc.perform(get("/api/")).andExpect(status().isOk()).andReturn();
}
@Test
public void test_getStudent_valid_parameters() throws Exception {
this.mvc.perform(get("/api/students/?pidm=272746")).andExpect(status().isOk()).andReturn();
}
}
Я был бы очень признателен за помощь.
Решение:
С тех пор я нашел этот SO-ответ , который решил мою проблему.