Mockito:多次调用相同的方法

时间:2012-11-20 14:12:00

标签: java unit-testing junit mocking mockito

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

3 个答案:

答案 0 :(得分:11)

你的存根应该按你的意愿工作。来自Mockito doc

  

一旦存根,该方法将始终返回存根值,无论如何   被调用的次数。

答案 1 :(得分:4)

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

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

...

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

Mockito将为每个匹配的呼叫返回相同的值。

答案 2 :(得分: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时执行作业。