我对脚本语言中的模拟非常熟悉。在我使用的大多数语言中,都有一个模拟框架,允许您调用伪函数。例如,在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的模拟框架中是否有可能。
答案 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
,可能有用。