次のクラスをテストしようとしています:
Class UserSynchronizer(){
private static org.apache.log4j.Logger log = ... ;
public Sync(candidate) {
...
if (candidate.inValidForSync()) {
log.debug("Candidate #" + candidate.getId() + ": Not syncing");
}
else {
log.debug("Syncing");
}
}
}
mockitoがどの引数log.debug
で呼び出されたかを検出できるかどうかを確認したいのですが、それに対して何らかの正規表現チェックを実行できるかどうかを確認したいと思います。つまり、次のことを行います。
以下のコードは私が出発点として持っているものです:
public void verifySyncDoesntSyncWhenInvalid(){
//Setup candidate mock
Candidate invalidSyncCandidateMock = mock(Candidate.class);
when(invalidSyncCandidateMock.inValidForSync()).thenReturn(true);
//Setup log mock
UserSynchronizer userSynchronizer = ...;
Field logField = userSynchronizer.getClass().getDeclaredField("log");
logField.setAccessible(true);
logField.set(userSynchronizer, logMock);
//Call sync
userSynchronizer.sync(invalidSyncCandidateMock);
//Verify that debug was called with ("Candidate #\d+: Not syncing")
???
}
問題は、それlog.debug
が複数回呼び出されることです。に提供されている引数をキャプチャして、log.debug
同期に対して無効な候補で呼び出されたときに、ロガーオブジェクトが候補が同期されなかったことを正しくログに記録したいと考えています。
編集:これが以前に尋ねられた場合、私はお詫び申し上げます。関連する質問へのリンクを投稿してください:)
あなたはこれを使うことができます:
final List<String> messages = new ArrayList<>();
final Answer<Void> catchMeAll = new Answer<Void>()
{
@Override
public Void answer(final InvocationOnMock invocation)
{
messages.add((String) invocation.getArguments()[0]);
}
}
doAnswer(catchMeAll).when(logMock).debug(anyString());
(注:このコードは、Logger
の.debug()
メソッドがを返すことを前提としていますvoid
。私は知らないが、誰Logger
が知っているかはわかりません)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加