【问题标题】:How to overwrite a settermethod in Mockito?如何覆盖 Mockito 中的 settermethod?
【发布时间】:2013-04-11 08:29:30
【问题描述】:

我似乎无法弄清楚如何使用 Mockito 模拟一个简单的 setter 方法。我有以下课程:

class MyClass {
    private SomeObject someObject;

    public void setSomeObject(SomeObject someObject) {
        this.someObject = someObject;
    }

    public someObject getSomeObject() {
        return someObject;
    }
}

现在我只想在调用“setSomeObject”时设置一个新的“SomeObject”实例。设置器中的参数也应该被忽略。

我需要这样的东西:

MyClass mockedClass = mock(MyClass.class);
when(mockedClass.setSomeObject([ignoreWhatsInHere]))
    .then(mockedClass.setSomeObject(new SomeObject();

但是,我似乎无法让语法为此工作。我只能使用 getters() 让模拟工作,因为这样我就可以返回一些东西。但我不知道如何为 setters() 做同样的事情。

感谢所有帮助。

【问题讨论】:

  • 为什么需要它?你到底想达到什么目标?
  • hmm 这不起作用,因为它说退货不适用于 void :/
  • 好吧,setSomeObject() 将以某种方式被调用:myClass.setSomeObject(someWeirdFunction.whichreturnsfinallySomeObject())。所以实际上我只想知道是否存在对 setter 的调用,然后自己设置对象。
  • 不要模拟值对象!

标签: java mockito setter overwrite


【解决方案1】:

在测试返回 void 的方法(包括 setter)时,您应该能够使用 doThrow()|doAnswer()|doNothing()|doReturn() 系列方法执行适当的操作。所以不是

when(mockedObject.someMethod()).thenReturn(something)

您可以使用 doAnswer() 返回一个自定义的 Answer 对象,虽然它不是非常优雅,而且您最好使用存根:

doAnswer(new Answer() { 
    public Object answer(InvocationOnMock invocation) {
          //whatever code you want to run when the method is called
          return null;
  }}).when(mockedObject).someMethod();
}

如果您尝试从同一个 getter 调用返回不同的值,您可能还想查看 mockito 的连续存根调用,例如,这将允许您在第一次调用方法时抛出错误,并且然后从第二次调用返回一个对象。

请参阅http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#12 了解有关这两个方面的更多详细信息。

【讨论】:

    猜你喜欢
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多