Как обрабатывать исключения в тестовом примере
@RunWith(SpringRunner.class)
@WebMvcTest(MyController.class)
@ContextConfiguration(classes = Application.class)
public class MyControllerTest {
@Autowired
MockMvc mockMvc;
@MockBean
EmployeeService employeeService;
@MockBean
EmployeeRepo employeeRepo;
@MockBean
ValidationService validationService;
@Before
public void setup(){
emp=new Employee();
objectMapper=new ObjectMapper();
emp.setId("123");
emp.setAge(100);
emp.setName("pasam");
System.out.println("Employee object before Test"+emp);
}
@Test
public void createEmp() throws Exception{
mockMvc.perform(MockMvcRequestBuilders.post("/sample/insert")
.accept(MediaType.APPLICATION_JSON_VALUE)
.contentType(MediaType.APPLICATION_JSON_VALUE)
.content(objectMapper.writeValueAsString(emp))).andExpect(status().isOk()).andDo(print());
}
}
@RestController
@RequestMapping("/sample")
public class MyController {
@Autowired
private EmployeeService employeeService;
@Autowired
private ValidationService validationService;
@PostMapping(value = "/insert",consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity insertEmployee(@RequestBody Employee employee){
validationService.validateEmp(employee);
employeeService.create(employee);
return ResponseEntity.ok().build();
}
}
public interface ValidationService {
void validateEmp(Employee employee) ;
}
@Slf4j
@Service
public class ValidateServiceImpl implements ValidationService {
@Override
public void validateEmp(Employee employee) {
if(employee.getAge()!=0){
log.info("Age can not be 0");
}
}
}
Я пытаюсь написать тестовые случаи для загрузочного контроллера Spring с помощью Spring Runner. В моем контроллере я хочу проверить объект сотрудника, для этого я написал интерфейс службы проверки. Наверх Контрольный пример Передан с помощью метода validate employee. При отладке выше test case.debug точка не входит в класс validationServiceImpl. Я хочу выдать ошибку при проверке объекта Employee. Как обработать исключение в тестовом примере.
1 ответ
На самом деле вы издеваетесь ValidationService
зависимость:
@MockBean
ValidationService validationService;
И вы не указываете на ложное поведение. Так что это позволяет сделать validatorService
зависимость, которая будет вызываться без исключения. Это работает как validateEmp()
Метод не предназначен для возврата чего-либо, необходимого для рабочего процесса тестируемого метода.
Как напоминание, тест с пометкой WebMvcTest
предназначен для тестирования контроллера, а не сервисного тестирования.
Вы можете удалить @MockBean
аннотация, чтобы сделать validationService
Реальная реализация, а не издевательство
ValidationService validationService;
Но обратите внимание, что лучший способ проверить ValidationService
создает для него модульный тест.
Наконец, отметьте также, что еще лучшим способом было бы использовать javax.validation
API для проверки ввода.
Вы можете аннотировать в классе Employee, чтобы определить ограничения для полей, и в контроллере, чтобы проверить параметр, такой как:
import javax.validation.Valid;
...
@PostMapping(value = "/insert",consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity insertEmployee(@Valid @RequestBody Employee employe){
// validationService.validateEmp(employee); // Not required any longer
employeeService.create(employee);
return ResponseEntity.ok().build();
}