0

我已经为 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";
}

现在我的junit测试代码是

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()方法是 void 方法,所以我使用了 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)

显示在......

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

4

2 回答 2

1

我想你快到了(见下文)。这里 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;
      }
  });
于 2013-04-12T11:36:59.380 回答
1

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

几乎所有主要的 Web 框架都有这些类的版本,您可以在这个 JarFinder Search forMockHttpSession . 就个人而言,我更喜欢Spring Reference包 javadoc中描述的 Spring mock 组件。

于 2013-04-12T12:19:57.370 回答