【问题标题】:How To Handle Exception in Test Case如何处理测试用例中的异常
【发布时间】:2018-10-09 14:27:21
【问题描述】:
@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 启动控制器编写测试用例,在我的控制器中我想验证员工对象,因为我已经编写了验证服务接口。上面的测试用例通过验证员工。同时调试上面的测试case.debug 点不进入validationServiceImpl 类。我想在Validate Employee Object 时抛出错误。如何在测试用例中处理异常。

【问题讨论】:

    标签: spring-boot controller mockmvc springrunner


    【解决方案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();    
     }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    相关资源
    最近更新 更多