对象哈希码不匹配的方法



我已经为HttpSession创建了一个模拟对象,如下所示。

HttpSession mocks.createMock(HttpSession.class);

现在我正在测试一些方法,方法是

public String validateProduct(String productId,Model model,HttpServletRequest request){
    Customer customer=new Customer();
    Product product=customerService.validateProduct(productId, VSCConstants.CLIENT_CODE);
    customer.setProduct(product);
    /*Doing more operation with customer*/
    request.getSession().setAttribute(
            VSCConstants.SESSION_CUSTOMER,customer);
    request.setAttribute("response", "InValidVIN");
    return "forward:/profile";
}
现在我的单元测试代码是
expect(customerService.validateProduct(null, VSCConstants.CLIENT_CODE))
            .andReturn(new Product());
expect(request.getSession()).andReturn(session).anyTimes();
    session.setAttribute(VSCConstants.SESSION_CUSTOMER, createdObject);
    expectLastCall().andAnswer(new IAnswer<Customer>() {
          public Customer answer() throws Throwable {
              createdObject= (Customer) EasyMock.getCurrentArguments()[1];
              return null;
          }
    });

现在的问题是session.setAttribute()方法是无效的方法,所以我已经使用了expectLastCall()但是如果你看到我正在测试的方法正在创建一个新客户并将其添加到会话中,那么这里它就会出现不匹配,并且我得到了流动异常。

Unexpected method call HttpSession.setAttribute("SESSION_CUSTOMER", com.budco.vsc.domain.Customer@feebefcb):
HttpSession.setAttribute("SESSION_CUSTOMER", null): expected: 1, actual: 0
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:44)
at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:85)
at $Proxy6.setAttribute(Unknown Source)
at com.budco.vsc.mvc.controller.AdvancedCustomerSearchController.validateProduct(AdvancedCustomerSearchController.java:110)
at com.budco.vsc.mvc.controller.AdvancedCustomerSearchController.getAdvancedSearchResult(AdvancedCustomerSearchController.java:83)
at com.budco.vsc.mvc.controller.AdvancedCustomerSearchControllerTest.testgetAdvancedSearchResultWithValidateProduct(AdvancedCustomerSearchControllerTest.java:148)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

show on .....

我希望,我需要使用在测试方法中使用的相同的客户对象,但这是不可能的,因为该方法正在创建对象。第二种选择可能是覆盖hashCode(),但它会很重,因为该方法在customer上做了很多事情,而且它是一个非常大的对象,包含很多其他对象和集合。有没有简单的方法可以让我跳过不匹配

我觉得你快成功了(见下文)。这里1是您试图获得句柄的Customer对象的setAttribute中的参数索引。一旦你有了它,你应该能够比较两个Customer对象没有任何问题。

  private static Customer createdObject;

  expectLastCall().andAnswer(new IAnswer<Customer>() {
      public Customer answer() throws Throwable {
          createdObject = (Customer) EasyMock.getCurrentArguments()[1];
          return null;
      }
  });

在测试servlet代码时,我个人会避免使用模拟框架模拟请求、响应和会话,而是使用专用的MockHttpServletRequestMockHttpServletResponseMockHttpSession对象,所有这些都可以通过编程进行交互。

几乎所有主要的web框架都有这些类的版本,你可以在这个JarFinder搜索MockHttpSession中看到。就我个人而言,我更喜欢Spring参考和javadoc包中描述的Spring模拟组件。

最新更新