5

Mockitoのモックオブジェクトで特定のインタラクション(特定のメソッド呼び出し)が発生したことを確認するのは簡単で、verifyZeroInteractions()インタラクションがまったく発生しなかったことを確認するためのものがあります。info()、などのメソッドを使用してwarn()、ロガーのインターフェイスなどのインターフェイスをテストしているとしますerror()。特定のシナリオでは、これらのメソッドの1つを呼び出す必要があることはわかっていますが、どちらを呼び出すかはあまり気にしません。どのメソッドを正確に呼び出す必要があるかを指定する必要なしに、モックオブジェクトとの相互作用が発生したことを確認するコンパクトな方法はありますか?あるいは、これをテストする「Mockitoの方法」は私が想像するものとは異なるため、おそらくそのようなメカニズムは必要ありませんか?

4

3 に答える 3

2

log4j を使用してロガーをテストするには、次のセットアップを行います。

@Mock private Appender log4jAppender;
private Logger logger;

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);

    Logger root = Logger.getRootLogger();
    if (!root.getAllAppenders().hasMoreElements()) {
        // No appenders means log4j is not initialized!
        BasicConfigurator.configure();
    }
    logger = Logger.getLogger(MyClassWhichLogs.class);
    logger.addAppender(log4jAppender);
}

そして、私のテストでは、次のことを行います。

verifyZeroInteractions(log4jAppender);

また

verify(log4jAppender).doAppend(any(LoggingEvent.class);

ログに記録された値をテストする必要がある場合は、代わりにキャプターを提供できます。

ArgumentCaptor<LoggingEvent> logCaptor = ArgumentCaptor.forClass(LoggingEvent.class);
verify(log4jAppender).doAppend(logCaptor.capture());
assertTrue(logCaptor.getValue().contains("my text to match");

これは必ずしも一般化された質問に答えているわけではありませんが (あなたが探しているものが存在するとは思いません)、ロギングのテストに関するこの特定の問題を解決できる可能性があります。

于 2012-06-25T16:24:40.923 に答える
1

テスト対象のクラスからロガー オブジェクトの作成を外部化できる場合、どのメソッドが実行されたかを記録し、テスト セットアップの一部として挿入する Log Interface の独自のテスト実装を作成できない理由はありません。

モック ライブラリは多くの利点をもたらしますが、ニーズをカバーできないようなコーナー ケースが見つかることがあります。

このようなテスト用に独自の実装を作成し、それをテスト対象のテスト クラスに挿入すると、次のようにアサートできます。getCount() > 0

public class LoggerTestSupportImpl implements ILogger {

    private int count = 0;

    @Override
    public int getCount() {
        return count;
    }

    @Override
    public void info(String message) {
        count++;    
    }

    @Override
    public void warn(String message) {
        count++;    
    }   
}
于 2012-06-26T09:18:03.737 に答える