如何处理测试用例中的异常

How To Handle Exception in Test Case

@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 Runner 为 Spring 启动控制器编写测试用例,在我的控制器中我想验证员工对象,为此我编写了验证服务接口。以上测试案例通过验证 employee.while 调试以上测试 case.debug 点不进入 validationServiceImpl class.I 想要在验证员工 Object.How 处理测试用例中的异常时抛出错误。

实际上你模拟了 ValidationService 依赖:

@MockBean
ValidationService validationService;

并且您没有指定模拟行为。所以它允许在不抛出任何异常的情况下调用 validatorService 依赖项。它的工作原理是 validateEmp() 方法并非设计用于 return 被测方法的工作流程所需的任何东西。

提醒一下,带有 WebMvcTest 注释的测试旨在专注于控制器测试,而不是服务测试。
您可以删除 @MockBean 注释以使 validationService 成为真正的实现而不是模拟:

ValidationService validationService;

但请注意,测试单一 ValidationService 的更好方法是为其创建单元测试。

最后还要注意,更好的方法是使用 javax.validation API 来验证输入。
您可以在 Employee class 中注释以定义字段上的约束,并在控制器中注释以验证参数,例如:

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();    
 }