14

我正在用 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 中发现了一个错误。

4

3 回答 3

13

您的存根应该按您的意愿工作。来自Mockito 文档

一旦被存根,该方法将始终返回存根值,无论它被调用多少次。

于 2012-11-20T14:17:42.010 回答
4

除非我遗漏了什么,否则如果您想为每个方法调用返回相同的对象,那么为什么不简单呢:

final LogEntry entry = new LogEntry()
when(mockLogger.createNewLogEntry()).thenReturn(entry);
when(mockLogger.getLogEntry()).thenReturn(entry);

...

verify(mockLogger).createNewLogEntry();
verify(mockLogger, times(???)).getLogEntry();

Mockito 将为每个匹配的调用返回相同的值。

于 2012-11-20T14:31:03.303 回答
1

我错过了什么,还是以下就足够了?

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.

于 2012-11-20T14:22:47.010 回答