使用Mockito模拟控制器的测试用例

时间:2016-03-11 17:36:11

标签: mocking

我是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

1 个答案:

答案 0 :(得分:0)

模拟使用.equals()方法确定方法调用是否与预期调用匹配。您应该覆盖.equals()类中的CreditCard

否则它将默认为Object.equals()方法,如果它比较的两个对象相同,则只返回true。

他们不一样。预期值是您在测试类中实例化的CreditCard实例。实际值是您在控制器中实例化的CreditCard实例。