Итак, у меня есть этот модульный тест, который мне нужно запустить.
@MockBean
private AppServiceImpl appService;
@Test
public void shouldThrowExceptionWhenAppIdIsNull() throws Exception {
File inputFile = this.getJsonFile();
RequestDto requestDto = objectMapper.readValue(inputFile.getAbsoluteFile(),
RequestDto.class);
AppData appData = requestDto.getAppData();
appData.setAppId(null);
requestDto.setAppData(appData);
when(appService.getUrl(requestDto, "header")).thenThrow(new RequestNotValidException());
String payload = objectMapper.writeValueAsString(requestDto);
this.mockMvc.perform(post(Base_URL + "app/requesturl")
.contentType(contentType).content(payload).header(this.Header, "header"))
.andExpect(status().is4xxClientError());
}
Интерфейс для обслуживания:
Итак, когда я запускаю этот тест, он выдает исключение и фактически не утверждает тест здесь.
Я добавил @ResponseStatus(HttpStatus.BAD_REQUEST) поверх RequestNotValidException, и он расширяет RunTimeException
И во втором тестовом примере я получаю пустой ответ. Я попробовал этот API через Postman и получил ответ. Там все нормально работает.
@Test
public void getCardRegistration() throws Exception {
File inputFile = this.getJsonFile();
RequestDto requestDto = objectMapper.readValue(inputFile.getAbsoluteFile(), RequestDto.class);
ResponseDto responseDto = new ResponseDto();
responseDto.setURL(AuthUtils.randomStringToken(35));
given(appService.getRegistrationUrl(requestDto, "header")).willReturn(responseDto);
String payload = objectMapper.writeValueAsString(requestDto);
MvcResult mvcResult = this.mockMvc.perform(post(Base_URL + "app/requesturl")
.contentType(contentType).content(payload).header(this.Header, "header"))
.andReturn();
String contentAsString = mvcResult.getResponse().getContentAsString();
}
Содержание контроллера:
@Autowired
IAppService appService;
@RequestMapping(value = "/app/requesturl", method = RequestMethod.POST)
public ResponseDto getCardsRegistration(@RequestBody @Valid RequestDto requestDto, @RequestHeader(value = "X-App-Name", required = true) String header) throws RequestNotValidException, JsonProcessingException {
log.info("Request received in controller: "+ mapper.writeValueAsString(cardRegistrationRequestDto));
log.info("Header value: "+ header);
return this.appService.getRegistrationUrl(requestDto, header);
}
Тестовый класс:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class AppRestControllerTest {
protected String Base_URL = "/app";
protected String Header = "X-App-Name";
protected MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(),
MediaType.APPLICATION_JSON.getSubtype(),
Charset.forName("utf8"));
@Autowired
protected MockMvc mockMvc;
protected ObjectMapper objectMapper = new ObjectMapper();
@MockBean
private AppServiceImpl appService;
@Mock
private AppRegistrationRepository appRegistrationRepository;
@Before
public void setUp() throws Exception {
MapperFacade mapperFacade = new DefaultMapperFactory.Builder().build().getMapperFacade();
appService = new AppServiceImpl(appRegistrationRepository, mapperFacade);
}
Что я здесь пропустил?
Также вы можете поискать этот вопрос (stackoverflow.com/questions/18336277/…), похоже, он может помочь вам с вашими тестами. (ищите метод ".andExpect"
О да. Оно работает. Раньше мне это не приходило в голову. Что мне не хватает во втором тестовом примере?
Могу я увидеть вашу полную конфигурацию? Обновите пост, пожалуйста
Какие конфигурации?
Тестовая конфигурация (полный тестовый класс). А еще было бы неплохо увидеть свой контроллер.
Хорошо. В тестовом классе больше ничего, кроме этих двух методов. Добавлю контроллер.
Все аннотации важны. Также важно то, как вы настраиваете контроллер во время тестирования.
@PospolitaNikita Обновлено
У вас есть @RestController над классом вашего контроллера?
Да, у меня есть @RestController над классом контроллера




Попробуй использовать
@RunWith(SpringRunner.class)
@WebMvcTest(YourController.class)
public class AppRestControllerTest {
Или же
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
public class AppRestControllerTest {
В ваших тестах
с первым блоком все тестовые примеры не прошли. и ничего не изменилось, когда я добавил второй блок.
Не удалось загрузить ApplicationContext
Не удалось загрузить из-за чего?
java.lang.IllegalStateException: не удалось загрузить ApplicationContext
Всегда ли содержимое RestController будет пустым?
java.lang.IllegalStateException: не удалось загрузить ApplicationContext - это все еще не причина исключения. (: Можете ли вы дать полную трассировку стека? «Будет ли контент всегда оставаться пустым для RestController?» - Нет, это проблема конфигурации, и уже есть другой ответ на SO: stackoverflow.com/questions/43691094/…
возможно это потому, что вы не вызывали initMocks (this); в методе @Before init
Это сработало, когда я просто использовал andExpect (status (). IsOk ()). Это не удается, когда я пытаюсь получить доступ к контенту.
Вы пробовали @Test (expected = RequestNotValidException.class) в первом случае?