>我正在使用Mockito模拟一个对象,该对象上的相同方法被多次调用,我想每次都返回相同的值。
这是我所拥有的:
LogEntry entry = null; // this is a field
// This method is called once only.
when(mockLogger.createNewLogEntry()).thenAnswer(new Answer<LogEntry>() {
@Override
public LogEntry answer(InvocationOnMock invocationOnMock) throws Throwable {
entry = new LogEntry();
return entry;
}
});
// This method can be called multiple times,
// If called after createNewLogEntry() - should return initialized entry.
// If called before createNewLogEntry() - should return null.
when(mockLogger.getLogEntry()).thenAnswer(new Answer<LogEntry>() {
@Override
public LogEntry answer(InvocationOnMock invocationOnMock) throws Throwable {
return entry;
}
});
问题是,我的getLogEntry方法似乎只被调用了一次。对于所有后续调用,将返回null
,并在测试中获取 NPE。
如何告诉 mockito 对所有呼叫使用存根版本?
==
为后代验
我做了一些额外的调查,一如既往,这不是图书馆的错,这是我的错。在我的代码中,调用getLogEntry()
的方法之一在调用createNewLogEntry()
之前。NPE是绝对合法的,测试实际上在我的代码中发现了一个错误,而不是我在Mockito中发现了错误。
您的存根应该可以根据需要工作。来自Mockito文档:
一旦存根,该方法将始终返回存根值,无论 它被调用了多少次。
除非我错过了什么,如果你想为每个方法调用返回相同的对象,那么为什么不简单地这样做:
final LogEntry entry = new LogEntry()
when(mockLogger.createNewLogEntry()).thenReturn(entry);
when(mockLogger.getLogEntry()).thenReturn(entry);
...
verify(mockLogger).createNewLogEntry();
verify(mockLogger, times(???)).getLogEntry();
Mockito将为每个匹配的调用返回相同的值。
我错过了什么,还是以下就足够了?
LogEntry entry = null; // this is a field
when(mockLogger.createNewLogEntry()).thenAnswer(new Answer<LogEntry>() {
@Override
public LogEntry answer(InvocationOnMock invocationOnMock) throws Throwable {
if (entry == null) {
entry = new LogEntry();
}
return entry;
}
});
when(mockLogger.getLogEntry()).thenAnswer(new Answer<LogEntry>() {
@Override
public LogEntry answer(InvocationOnMock invocationOnMock) throws Throwable {
return entry;
}
});
仅在entry == null
时执行分配。