1

目標は、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で実行しています。

4

2 に答える 2

0

アプリケーション コードを見ないと、何を提案すればよいかを正確に判断することは困難です。しかし、 log4j をモックできますLoggerか? のモックを注入しLoggerて、正しいログ メソッドが呼び出されていることを確認するだけです。

代わりにモックを作成するFileOutputStreamと、実際に log4j をテストするだけでなく、独自のアプリケーション コードをテストすることになります。あなたが log4j の開発チームに属していない限り、おそらくこれを行いたくないでしょう。

于 2013-03-16T22:24:45.357 に答える
0

答え: 邪魔になったので、ServletUnit/HttpUnit の使用を排除します。それが静的な初期化なのか、プライベートスコープなのか、あるいはその両方なのかはわかりませんが、偽のコンテナを取り除き、ベアクラスをインスタンス化しただけで、それが機能する必要がありました。

于 2013-03-26T14:14:10.870 に答える