如何处理测试用例中的异常
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();
}
@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();
}