使用 Mockito 模拟控制器的测试用例
Mocking test cases for controller using Mockito
我是 Mockito 测试用例的新手。我想模拟控制器,它具有下面列出的非常简单的服务。
我的模拟测试 class 有一个错误,错误的属性传递给 mockito ,下面是我的错误
@RunWith(MockitoJUnitRunner.class)
public class CreditCardControllerTest {
@Mock
private CreditCardService creditCardService;
@Mock
Model model;
Person p;
@Mock
CreditCard creditCard ;
@InjectMocks
CreditCardController cc= new CreditCardController();
@Before
public void setUp(){
p= new Person();
creditCard = new CreditCard();
}
@Test
public void m1(){
assertEquals("add-credit-card",cc.getAdd(p.getId(), model));
Mockito.verify(model).addAttribute("personId", p.getId());
Mockito.verify(model).addAttribute("creditCardAttribute", creditCard);
}
}
错误如下:
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";
}
}
下面是我的信用卡class:
@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;
}
}
谁能告诉我哪里出错了?..
终于从flup那里得到了答案,写下了测试;
@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));
}
Mocks 使用 .equals()
方法来确定方法调用是否与预期调用匹配。您应该在 CreditCard
class.
中覆盖 .equals()
否则它会默认使用 Object.equals()
方法,只有当它比较的两个对象相同时 returns 才为真。
而且它们不一样。预期值是您在测试中实例化的 CreditCard 实例 class。实际值是您在控制器中实例化的 CreditCard 实例。
我是 Mockito 测试用例的新手。我想模拟控制器,它具有下面列出的非常简单的服务。 我的模拟测试 class 有一个错误,错误的属性传递给 mockito ,下面是我的错误
@RunWith(MockitoJUnitRunner.class)
public class CreditCardControllerTest {
@Mock
private CreditCardService creditCardService;
@Mock
Model model;
Person p;
@Mock
CreditCard creditCard ;
@InjectMocks
CreditCardController cc= new CreditCardController();
@Before
public void setUp(){
p= new Person();
creditCard = new CreditCard();
}
@Test
public void m1(){
assertEquals("add-credit-card",cc.getAdd(p.getId(), model));
Mockito.verify(model).addAttribute("personId", p.getId());
Mockito.verify(model).addAttribute("creditCardAttribute", creditCard);
}
}
错误如下:
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";
}
}
下面是我的信用卡class:
@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;
}
}
谁能告诉我哪里出错了?..
终于从flup那里得到了答案,写下了测试;
@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));
}
Mocks 使用 .equals()
方法来确定方法调用是否与预期调用匹配。您应该在 CreditCard
class.
.equals()
否则它会默认使用 Object.equals()
方法,只有当它比较的两个对象相同时 returns 才为真。
而且它们不一样。预期值是您在测试中实例化的 CreditCard 实例 class。实际值是您在控制器中实例化的 CreditCard 实例。