У меня действительно есть простой веб-сервис, и я хочу добавить новый тест 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




doNothing() используется только для методов void, как описано в вашем сообщении об ошибке, в вашем случае вы должны использовать что-то вроде:
when(teamService.createTeam(teamDto)).thenReturn(Reponse.ok().build());
Примечание: вы должны переопределить метод @equals в своем классе TeamDto.
Основываясь на ошибке, я предполагаю, что 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
@InjectMocks
Controller controllerMock;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(controllerMock).build();
}
где - ControllerMock будет имитировать класс контроллера
Спасибо, приятно знать, что я новичок в тестировании. Но когда я добавляю Ваше решение, я не могу использовать Response: / Это реализация койота?