はい、正しく読みました:Javaでレコーダーをシミュレートしています。「このメッセージを最初に表示したとき、奇妙に聞こえるかもしれませんが、特別な場合には、アプリケーションの特定の部分で単体テストが実行されます唯一の方法は、特定のメッセージが記録されているかどうかを確認することです。
たとえば、アプリケーションが他のいくつかのWebServicesに対して非同期呼び出しを行う必要があるとします。その後、この呼び出しを行うための別のスレッドがあります。メインスレッドの場合、サービスの呼び出しが成功するかどうかは関係ありません。応答を待機しないためです(そうしないと、同期になりますよね?)。アプリケーションのこの部分がサービスを呼び出すだけで、呼び出しが成功したかどうかのみを記録するとします(言うまでもなく、この場合、状況がいつ発生しないかを知るための監視ツールが必要です)。生産は良好です。
次に、これらのシナリオをカバーするJUnitテストケースを作成する必要があります。Google検索を使用すると、動的シミュレーションが使用される場合がありますが、すでにMochitoを使用していて、何らかの理由で、Mochitoを必要なだけ使用したいと想像してください。
この記事では、あなたがすでにMochitoに精通していることを前提としているので、「アナログレコーダー」セクションに焦点を当てます。インターネットでチュートリアルを学びたいなら、もちとをたくさん見つけることができます。
わかりました。これを実現する1つの方法は、ロガーオブジェクトのアペンダーをシミュレートし、MochitoのArgumentCaptorを使用してテストケースのすべてのログイベントをキャプチャすることです。
@Mock
private Appender mockedAppender;
@Captor
private ArgumentCaptor<LoggingEvent> loggingEventCaptor;
次に、テストを実行する前に、アペンダーがルートレコーダーに追加されていることを確認する必要があります。
@Before
public void setup() {
Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
root.addAppender(mockedAppender);
root.setLevel(Level.INFO);
}
その後、テストクラスを呼び出して、記録されたメッセージをアサートできます。
@Test
public void testSuccessCall() throws Exception {
// mock all required response objects in here
[...]
// this is the call to the service being tested
myService.execute(createRequestForSuccessResponse());
// check how many times the ArgumentCaptor was called
verify(mockAppender, times(1)).doAppend(loggingEventCaptor.capture());
// get the reference to the LoggingEvent you want to inspect
LoggingEvent loggingEvent = loggingEventCaptor.getAllValues().get(0);
// check the logged message
assertEquals("Webservice was successfully called", loggingEvent.getMessage());
// check the log level
assertEquals(Level.INFO, loggingEvent.getLevel());
}
この特別な状況に直面したときに、これが最終的に役立つことを願っています!;-)
から:https://dev.to//claudiohigashi/mocking-logger-in-java-with-mockito-51k8