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 メソッドが 1 回しか呼び出されないように見えることです。以降のすべての呼び出しでnullは、代わりに が返され、テストで NPE が取得されます。
すべての呼び出しにスタブ バージョンを使用するように mockito に指示するにはどうすればよいですか?

================================================== ===============
後世のための事後分析

私は追加の調査を行いましたが、いつものように、それは図書館のせいではなく、私のせいです。私のコードでは、 をgetLogEntry()呼び出す前にメソッドの 1 つが呼び出されcreateNewLogEntry()ました。NPE は完全に正当なものでした。テストでは、Mockito でバグを見つけたのではなく、実際に私のコードでバグを見つけました。

4

3 に答える 3

13

スタブは、必要に応じて機能するはずです。Mockito docから:

スタブ化されると、メソッドは何度呼び出されても常にスタブ化された値を返します。

于 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 に答える