Тест Junit с методом mock for rest controller

У меня действительно есть простой веб-сервис, и я хочу добавить новый тест junit. У меня есть метод, с помощью которого я добавляю людей в команды. Это мой метод (в контроллере отдыха):

@PostMapping("/addPeopleToTeams/{teamId}/{personId}")
@ResponseBody
public ResponseEntity<?> addPeopleToTeam(@PathVariable Long teamId, @PathVariable Long personId) {
    TeamsAndPersonsId teamsAndPersonsId = new TeamsAndPersonsId(personId, teamId);
    teamService.findTeamById(teamsAndPersonsId.getTeamId());
    personService.findById(teamsAndPersonsId.getPersonId());
    teamService.addPersonsToTeams(personId, teamId);
    return ResponseEntity.ok(teamsAndPersonsId);

}

Для этого метода я хочу написать тест Junit, но что-то идет не так: / Это мой тестовый класс с методом:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class TeamControllerTest {

    private ObjectMapper mappingObject = new ObjectMapper();
    private MockMvc mockMvc;
    @Mock
    private TeamService teamService;
    private PersonService personService;

    @Before
    public void initTest() {
        mockMvc = MockMvcBuilders
                .standaloneSetup(new TeamController(teamService, personService))
                .setControllerAdvice(GlobalExceptionHandler.class)
                .build();
    }
        @Test
    public void shouldAddPersonToTeam() throws Exception{
        TeamDto teamDto = prepareTeamDto();
        PersonDto personDto = new PersonDto(1L, "Bob", "Noob", "[email protected]", "Warszawa", "APPS", "Developer");
        doNothing().when(teamService).createTeam(teamDto);
        doNothing().when(personService).addPerson(personDto);

        mockMvc.perform(post("/addPeopleToTeams/{teamId}/{personId}",1,1))

                .andExpect(status().isOk());

    }

    private TeamDto prepareTeamDto() {
        return new TeamDto(1L, "Jan", "local", "wawa", 6);
    }

На самом деле для этого метода у меня есть такая ошибка:

org.mockito.exceptions.base.MockitoException: 
Only void methods can doNothing()!
Example of correct use of doNothing():
    doNothing().
    doThrow(new RuntimeException())
    .when(mock).someVoidMethod();
Above means:
someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
762
3

Ответы 3

doNothing() используется только для методов void, как описано в вашем сообщении об ошибке, в вашем случае вы должны использовать что-то вроде:

when(teamService.createTeam(teamDto)).thenReturn(Reponse.ok().build());

Примечание: вы должны переопределить метод @equals в своем классе TeamDto.

Спасибо, приятно знать, что я новичок в тестировании. Но когда я добавляю Ваше решение, я не могу использовать Response: / Это реализация койота?

Magdalena Rumakowicz 12.06.2018 15:13

Основываясь на ошибке, я предполагаю, что TeamService.createTeam или PersonService.addPerson не имеют типа возврата void, и вы можете имитировать поведение doNothing только в методах, которые возвращают void. Также отсутствует аннотация @Mock в поле PersonService.

В весенних загрузочных тестах лучше использовать аннотацию @MockBean. А для тестов контроллера лучше использовать @WebMvcTest, тогда вы можете пропустить настройку, сделанную в вашем методе установки :)

также я думаю, что в вашем случае использования вы должны убедиться, что методы createTeam и addPerson вызываются для заданных макетов, а не пытаться имитировать какое-то поведение doNothing. См. static.javadoc.io/org.mockito/mockito-core/2.18.3/org/mockit‌ o /… в случае Mockito

Ondřej Benkovský 12.06.2018 15:21
@InjectMocks
Controller controllerMock;

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
    this.mockMvc = MockMvcBuilders.standaloneSetup(controllerMock).build();
}

где - ControllerMock будет имитировать класс контроллера

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