我是Mockito测试案例的新手。我想模拟控制器,它具有下面列出的非常简单的服务。 我的模拟测试类有一个错误,错误的属性传递给mockito,下面是我的错误
Argument(s) are different! Wanted:
model.addAttribute(
"creditCardAttribute",
org.krams.tutorial.domain.CreditCard@f6c48ac
);
-> at org.krams.tutorial.controller.test.CreditCardControllerTest.m1(CreditCardControllerTest.java:40)
Actual invocation has different arguments:
model.addAttribute(
"creditCardAttribute",
org.krams.tutorial.domain.CreditCard@13deb50e
);
-> at org.krams.tutorial.controller.CreditCardController.getAdd(CreditCardController.java:41)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at org.krams.tutorial.controller.test.CreditCardControllerTest.m1(CreditCardControllerTest.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
以下是错误:
@Controller
@RequestMapping("/main/creditcard")
public class CreditCardController {
protected static Logger logger = Logger.getLogger("controller");
@Resource(name="creditCardService")
private CreditCardService creditCardService;
/**
* Retrieves the "Add New Credit Card" page
*/
@RequestMapping(value = "/add", method = RequestMethod.GET)
public String getAdd(@RequestParam("id") Integer personId, Model model) {
logger.debug("Received request to show add page");
// Prepare model object
CreditCard creditCard = new CreditCard();
// Add to model
model.addAttribute("personId", personId);
model.addAttribute("creditCardAttribute", creditCard);
// This will resolve to /WEB-INF/jsp/add-credit-card.jsp
return "add-credit-card";
}
}
以下是我的控制器,它将信用卡详细信息添加到DB:
@Entity
@Table(name = "CREDIT_CARD_OM")
public class CreditCard implements Serializable {
private static final long serialVersionUID = 5924361831551833717L;
@Id
@Column(name = "ID")
@GeneratedValue
private Integer id;
@Column(name = "OMTYPE")
private String omtype;
@Column(name = "OMNUMBER")
private String omnumber;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getOmtype() {
return omtype;
}
public void setOmtype(String omtype) {
this.omtype = omtype;
}
public String getOmnumber() {
return omnumber;
}
public void setOmnumber(String omnumber) {
this.omnumber = omnumber;
}
}
以下是我的信用卡类:
@Test
public void m1(){
assertEquals("add-credit-card",cc.getAdd(p.getId(), model));
Mockito.verify(model).addAttribute("personId", p.getId());
//Mockito.verify(model).addAttribute(,creditCard);
Mockito.verify(model).addAttribute(eq("creditCardAttribute"),isA(CreditCard.class));
}
任何人都可以告诉我哪里出错了吗?..
最后我从flup得到了答案,并在下面写了测试;
690 06/30/2010
690 10/23/1989
690 06/21/2000
219 02/22/1996
219 06/25/2000
219 12/25/2012
316 06/12/2002
316 06/30/1998
316 03/26/2005
答案 0 :(得分:0)
模拟使用.equals()
方法确定方法调用是否与预期调用匹配。您应该覆盖.equals()
类中的CreditCard
。
否则它将默认为Object.equals()
方法,如果它比较的两个对象相同,则只返回true。
他们不一样。预期值是您在测试类中实例化的CreditCard实例。实际值是您在控制器中实例化的CreditCard实例。