Mockito:调用存根方法

时间:2018-07-26 14:09:29

标签: java unit-testing mocking mockito

我对脚本语言中的模拟非常熟悉。在我使用的大多数语言中,都有一个模拟框架,允许您调用伪函数。例如,在JavaScript中,您将使用sinon并调用callsFake,然后传入一个函数:

var sandbox = sinon.createSandbox();
sandbox.stub(myObject, 'some_method').callsFake(() => {
    //do stuff
});

在Perl中,您可以使用Test::MockModule->mock

my $mockedModule = Test::MockModule->new('Some::Module');
$mockedModule->mock('someMethod', sub {
    #Do stuff
});

在Java中可以做到这一点吗?我在Java中能做的最好的事情就是使用Mockito通过调用when(mock(MyClass.class).method()).thenReturn("foo");返回一个固定值。但这总是返回"foo",并且在调用MyClass.method()时不执行任何其他操作。我想知道是否有可能告诉Mockito调用假方法而不是调用真实方法。

在Mockito或其他Java的模拟框架中是否有可能。

2 个答案:

答案 0 :(得分:1)

一个选项是创建一个类,该类扩展了该类并覆盖了您不希望在测试中执行的行为。

另一个选项是:

when(mockedClass.method()).thenAnswer(new Answer() {
    private int count = 0;
    List<String> values = asList("a", "b")
    public Object answer(InvocationOnMock invocation) {
        return values.get(count++)
    }
});

但是它可能会提高测试的阅读强度和复杂性。

答案 1 :(得分:1)

看看AdditionalAnswers#answer(...),例如:

doAnswer(AdditionalAnswers.answer((a, b) -> a.equals(b))))
    .when(mock).execute(anyString(), anyString());

还有delegatesTo,可能有用。