Исключение вызова метода при использовании теста Spring MVC

У меня есть @RestController, определенный для обновления класса Person, как:

@RestController
@RequestMapping("/api/person")
class PersonRestController {

    @Autowired
    private IPersonService mPersonService;

    @PostMapping("/update")
    public Person updatePerson(@RequestBody Person person) {
        Optional<Person> personIfExists = mPersonService.findOneIfExists(person.id);
        if (!personIfExists.isPresent()) {
            throw new IllegalArgumentException();
        }
        return mPersonService.update(personIfExists.get());
    }
}

Для краткости предположим, что существует IPersonService и его правильная реализация. Реализация помечена @Service и находится на пути сканирования компонента весенней загрузки. Я использую фреймворки JMockit, TestNG и Spring MVC Test для тестирования этого контроллера. Я также использую GSON для преобразования объекта Person в JSON. Вот мой метод тестирования:

@Test
    public void testUpdateFileDetails() throws Exception {
        Person person = new Person();
        person.id = "P01";
        person.name = "SOME_PERSON_NAME";
        person.age = 99;

        new Expectations() {{
            mockedPersonService.findOneIfExists("P01");
            result = new IllegalArgumentException();
        }};

        String personJson = new Gson().toJson(person);

        mvc.perform(post("/api/person/update").content(personJson))
                .andExpect(status().is4xxClientError());
    }

Когда я запускаю этот тестовый пример, я продолжаю получать следующее исключение:

Missing 1 invocation to:
        com.mytestapplication.services.api.IPersonService#getFileDetails("P01")
        on mock instance: com.mytestapplication.services.api.$Impl_IPersonServcie@8c11eee

        Caused by: Missing invocations
        at com.mytestapplication.rest.api.PersonRestControllerTest$2.<init>(PersonRestControllerTest.java:<line_number>)
        at com.mytestapplication.rest.api.PersonRestControllerTest.testUpdatePerson(PersonRestControllerTest.java:<line_number>)

Здесь имеется в виду строка, содержащая оператор: new Expectations() {{ ... }}

Не могли бы вы помочь мне определить причину этого исключения?


person Prashant    schedule 14.08.2018    source источник


Ответы (1)


Похоже, вам нужно предоставить макет для вызова метода

mPersonService.update(personIfExists.get());

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

Также я считаю, что этот метод также имеет другой вызов метода getFileDetails в службе.

Поэтому, если предоставить макет для обоих этих вызовов метода, ваш тест должен работать.

person Japan Trivedi    schedule 14.08.2018
comment
Ok. Но в своем ответе я прошу издеваться над вызовами метода для IPersonServive. Попробуйте предоставить макет для вызовов методов mPersonService.update и personIfExist.get() - person Japan Trivedi; 17.09.2018