Модульное тестирование при весенней загрузке дает ошибку при возникновении исключения в службе

Итак, у меня есть этот модульный тест, который мне нужно запустить.

@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);
    }

Что я здесь пропустил?

Вы пробовали @Test (expected = RequestNotValidException.class) в первом случае?

Pospolita Nikita 27.06.2018 12:47

Также вы можете поискать этот вопрос (stackoverflow.com/questions/18336277/…), похоже, он может помочь вам с вашими тестами. (ищите метод ".andExpect"

Pospolita Nikita 27.06.2018 12:52

О да. Оно работает. Раньше мне это не приходило в голову. Что мне не хватает во втором тестовом примере?

nirvair 27.06.2018 12:58

Могу я увидеть вашу полную конфигурацию? Обновите пост, пожалуйста

Pospolita Nikita 27.06.2018 13:04

Какие конфигурации?

nirvair 27.06.2018 13:08

Тестовая конфигурация (полный тестовый класс). А еще было бы неплохо увидеть свой контроллер.

Pospolita Nikita 27.06.2018 13:27

Хорошо. В тестовом классе больше ничего, кроме этих двух методов. Добавлю контроллер.

nirvair 27.06.2018 13:57

Все аннотации важны. Также важно то, как вы настраиваете контроллер во время тестирования.

Pospolita Nikita 27.06.2018 13:59

@PospolitaNikita Обновлено

nirvair 27.06.2018 14:11

У вас есть @RestController над классом вашего контроллера?

Pospolita Nikita 27.06.2018 14:25

Да, у меня есть @RestController над классом контроллера

nirvair 27.06.2018 14:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
11
762
1

Ответы 1

Попробуй использовать

@RunWith(SpringRunner.class)
@WebMvcTest(YourController.class)
public class AppRestControllerTest {

Или же

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
public class AppRestControllerTest {

В ваших тестах

с первым блоком все тестовые примеры не прошли. и ничего не изменилось, когда я добавил второй блок.

nirvair 27.06.2018 15:25

Не удалось загрузить ApplicationContext

nirvair 27.06.2018 15:26

Не удалось загрузить из-за чего?

Pospolita Nikita 27.06.2018 15:29

java.lang.IllegalStateException: не удалось загрузить ApplicationContext

nirvair 27.06.2018 15:32

Всегда ли содержимое RestController будет пустым?

nirvair 27.06.2018 15:33

java.lang.IllegalStateException: не удалось загрузить ApplicationContext - это все еще не причина исключения. (: Можете ли вы дать полную трассировку стека? «Будет ли контент всегда оставаться пустым для RestController?» - Нет, это проблема конфигурации, и уже есть другой ответ на SO: stackoverflow.com/questions/43691094/…

Pospolita Nikita 27.06.2018 15:37

возможно это потому, что вы не вызывали initMocks (this); в методе @Before init

Pospolita Nikita 27.06.2018 15:39

Это сработало, когда я просто использовал andExpect (status (). IsOk ()). Это не удается, когда я пытаюсь получить доступ к контенту.

nirvair 27.06.2018 16:00

Другие вопросы по теме