6

モックされたオブジェクト(mockAなど)があるテストメソッドを作成しました。実際のプログラム ロジックに対する mockA のメソッド呼び出しを期待できます。しかし、私のプログラムの一部には、オブジェクトの情報を文字列形式で必要とするロギングもあります。文字列メッセージの作成中に、オブジェクトに対して呼び出される不要なメソッドがいくつかあります。そのため、テストの実行中に、これらのメソッド呼び出しが原因でテストが失敗します。これが例です。

public class Example {
    public int method(Foo foo) {
       int a = foo.doSomething(); //required for program.
       String logMessage = "foo did something." + foo.getA() + foo.getB().getC();
       logger.log(logFile, logMessage);
       return a;
    }
}

テスト方法の例を次に示します。

@Test
public void testMethod() {
   int something = 0;
   Foo mockFoo = EasyMock.createMock(Foo.class);
   expect(mockFoo.doSomething()).andReturn(something);
   EasyMock.replay(mockFoo);
   assertEquals(new Example().method(mockFoo), something);
   EasyMock.verify(mockFoo);
}

これにより、foo.getA() に対して予期しないメソッド呼び出しが発生しています。Foo.class の代わりにナイス モックを作成すると、B は foo 内のオブジェクトであるため、foo.getB().getC() に対して null ポインター例外が発生します。foo 内のすべてのオブジェクトの素敵なモックを作成することはできません。

ロギングに使用されるそのような文字列操作を防ぐ方法はありますか? あるいは、何ができるでしょうか?

ありがとう

4

3 に答える 3

1

モッキートはどうですか?ここで深いスタブを返す可能性をチェックしてください

(特に、それをすべきでない理由の部分;))、テストを次のように書くことができます:

@Test
public void testMethod() {
   int something = 0;
   Foo mockFoo = mock(Foo.class, RETURNS_DEEP_STUBS);
   when(mockFoo.doSomething()).thenReturn(something);
   assertEquals(new Example().method(mockFoo), something);
   verify(mockFoo);
}

Easymock で同様の手法を見つけることができませんでした。ここでの答えは、何もないことを示唆しています。


別のアイデア:

コードをリファクタリングし、SLF4J をロギング フレームワークとして使用できる場合は、ロガー呼び出し内でロギング メッセージを作成し、Loglevel に応じてのみ行うことができます。テスト内でログレベルを NONE に上げると、foo.getA() ... は実行されません。

public int method(Foo foo) {
   int a = foo.doSomething(); //required for program.
   logger.error("foo did something {}" , foo.getA() + foo.getB().getC());
   return a;
}
于 2013-10-17T12:03:51.143 に答える