Junit报错:Argument(s) are different! Wanted:

时间:2022-07-25
本文章向大家介绍Junit报错:Argument(s) are different! Wanted:,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
  1. 在controller中的方法如下:
/**
     * 处理注册的提交信息
     * @param spitter
     * @return
     */
    @RequestMapping(value = "/register", method = RequestMethod.POST)
    public String processRegister(Spitter spitter){
        spitterRepository.save(spitter);

        //跳转到个人信息页面
        return "redirect:/spitter/" + spitter.getUsername();
    }
  1. 在Junit类中的测试方法为:
    @Test
    public void shouldProcessRegistration() throws Exception {
        SpitterRepository mockRepository = mock(SpitterRepository.class);

        Spitter unsaved = new Spitter("xu", "jiafei", "dale", "123456");
        Spitter saved = new Spitter(10L,"xu", "jiafei", "dale", "123456");

        //当调用保存方法时,返回指定的数据
        when(mockRepository.save(unsaved)).thenReturn(saved);

        SpitterController spitterController = new SpitterController(mockRepository);

        MockMvc mockMvc = standaloneSetup(spitterController).build();

        mockMvc.perform(post("/spitter/register")
                .param("firstName","xu")
                .param("lastName","jiafei")
                .param("username","dale")
                .param("password","123456"))
                .andExpect(redirectedUrl("/spitter/dale"));

        //此处若不重写Spitter的Equals方法和hashCode方法时将会报错,说两次的参数传递不一样
        verify(mockRepository,atLeastOnce()).save(unsaved);
    }
  1. 如果在没有重写实体类Spitter的Equals方法和hashCode方法时, verify(mockRepository,atLeastOnce()).save(unsaved)方法会报错:
Argument(s) are different! Wanted:
spitterRepository.save(
    Spitter{id=null, firstName='xu', lastName='jiafei', username='dale', password='123456'}
);
-> at test.SpitterControllerTest.shouldProcessRegistration(SpitterControllerTest.java:57)
Actual invocation has different arguments:
spitterRepository.save(
    Spitter{id=null, firstName='xu', lastName='jiafei', username='dale', password='123456'}
);
-> at com.spittr.controller.SpitterController.processRegister(SpitterController.java:51)

结论:其实该验证方法的两次参数内容是一样的,之所以会报错是因为方法在比较时是使用的Equals方法和hashCode方法,而如果没重写这两个方法则使用的是Object的方法(判断是否为同一个对象)。如果要正确验证,需要重写这两个方法