目標は、RollingFileAppender を拡張するハード コーディングされた log4j アペンダーの機能テストを行い、MyAppender を使用して同じファイルに書き込む log4j ロガーの複数のインスタンスを再現できるようにすることです。私のアプローチは、log4j の FileAppender クラスによって作成された FileOutputStream の作成をインターセプトすることでした。
しかし、匿名 Answers の System.out 呼び出しは決して呼び出されません。FileOutputStream コンストラクターにブレークポイントを配置すると、以下で指定した引数を使用して、期待どおりに作成されていることがわかります。書き込みメソッドにブレークポイントを設定すると、呼び出されるのは 3 つの引数のバージョンです。
メーターウェアの ServletUnit を使用して、コンテナー内にいることをシミュレートしています。MyLogAppender.logFile は定数です。
私は何が欠けていますか?
@Test
@PrepareForTest({MyLogAppender.class})
public void MyLogMessageGetsWritten() throws SAXException, IOException, Exception {
//...
// INTERCEPT LOG HERE SOMEHOW
PowerMockito.mockStatic(FileOutputStream.class);
FileOutputStream mockFos = PowerMockito.mock(FileOutputStream.class);
PowerMockito.whenNew(FileOutputStream.class).withParameterTypes(String.class, boolean.class).withArguments(MyLogAppender.logFile, true).thenReturn(mockFos);
//...
PowerMockito.doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
Object mock = invocation.getMock();
System.out.println("write(byte[], int, int) Called with " + args);
return args;
}
}).when(mockFos).write(any(byte[].class), anyInt(), anyInt());
//...
// ASSERT LOG SUCCESS HERE
}
PSその部分を貼り付けていなくても、PowerMockRunnerで実行しています。