我已经为 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() 但它会很重,因为该方法在客户身上做了很多事情,而且它是一个非常大的对象,包含很多其他对象和集合。有什么简单的方法可以让我简单地跳过不匹配。