Как обработать исключение в тестовом примере - PullRequest
0 голосов
/ 29 апреля 2018
@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. В моем контроллере я хочу проверить объект сотрудника, для этого я написал интерфейс службы проверки. Точка case.debug не входит в класс validationServiceImpl. Я хочу выдать ошибку при проверке объекта Employee. Как обработать исключение в тестовом примере.

1 Ответ

0 голосов
/ 29 апреля 2018

На самом деле вы издеваетесь над зависимостью 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();    
 }
...