在Spring MVC Controller中测试POST方法的正确方法

时间:2018-02-24 14:07:05

标签: java unit-testing model-view-controller junit mockito

我有基于SpringMVC和Hibernate的简单应用程序,尝试测试将POST方法保存到数据库的Customer.class方法。不想测试数据库,只需要简单的单元测试。测试是绿色的,但感觉仍然不够,我怎么能重构它以使它成为它应该的?

CustomerController.class:

@Controller
@RequestMapping("/customer")
public class CustomerController {

  @Autowired
    private CustomerService customerService;

  @PostMapping("/saveCustomer")
    public String saveCustomer(@ModelAttribute("customer") Customer theCustomer) {
        customerService.saveCustomer(theCustomer);

        return "redirect:/customer/list";
    }}

CustomerServiceImpl.class:

@Service
public class CustomerServiceImpl implements CustomerService {
  @Override
  @Transactional
    public void saveCustomer(Customer theCustomer) {
        customerDAO.saveCustomer(theCustomer);
    }
}

CustomerDAOImpl.class:

@Repository
public class CustomerDAOImpl implements CustomerDAO {
  @Override
    public void saveCustomer(Customer theCustomer) {

        Session currentSession = sessionFactory.getCurrentSession();

        currentSession.saveOrUpdate(theCustomer);

    }
}

CustomerControllerTest.class:

public class CustomerControllerTest {


@InjectMocks
CustomerController controller;

@Mock
CustomerService mockCustomerService;

@Mock
View mockView;


MockMvc mockMvc;

@Before
public void setUp() throws Exception {

    MockitoAnnotations.initMocks(this);

    mockMvc = MockMvcBuilders.standaloneSetup(controller)
            .setSingleView(mockView)
            .build();
}
     @Test
        public void testSaveCustomer() throws Exception {

        mockMvc.perform(post("/customer/saveCustomer"))
                .andExpect(status().isOk())
                .andExpect(view().name("redirect:/customer/list"));

    }}

1 个答案:

答案 0 :(得分:0)

保存客户等对象的常见错误可能如下:

  1. POST请求中缺少属性,例如" FirstName"
  2. 使用" ID"
  3. 之类的只读属性
  4. 无效的属性类型(期望的int,得到的字符串)
  5. 无效的内容类型(预期的JSON,获得XML)
  6. 请求是否有权保存此对象?
  7. 无效请求是否返回了相应的响应代码?
  8. 除了单元测试之外,我强烈推荐Fiddler,因为它看起来像是在使用Windows。

    Fiddler将允许您拦截系统发出的每个HTTP请求。这将允许您检查单元测试发出的请求,以及有关POST请求标题,正文等的详细信息。

    https://www.telerik.com/fiddler

    当特定请求失败并且您需要确切地知道请求与成功请求相比时,此工具是您执行的最后一项工作。