2016-09-20 9 views
4

正しいメッセージがエラー状態のコードで記録されていることを検証しようとしています。したがって、org.apache.commons.logging.Logを嘲笑して正しく呼び出されたかどうかを確認しようとしています。Mockitoの引数をメソッドのシグネチャに一致させる方法

私が検証しようとしているメソッドのシグネチャは次のとおりです。error(Object, Throwable)文字列が渡されることを期待していますが、それにはさまざまなものがありますが、「メッセージはキューには大きすぎます」というテキストが含まれています。この場合、throwableはnullになります。ここで

がこれを検証するための私のコードです:

Mockito.verify(errorLog, Mockito.atLeastOnce()).error(
    Mockito.matches("*Message is too big for queue*"), 
    Mockito.isNull(Throwable.class)); 

これを実行すると、私もエラーが出ます:

Argument(s) are different! Wanted: 
log.error(
    matches("*Message is too big for queue*"), 
    isNull() 
); 
-> at com.company.TestClass.testMessageTooBig(TestClass.java:178) 
Actual invocation has different arguments: 
log.error(
    |ClassUnderTest|Message is too big for queue (size=41). It will never fit, so discarding., 
    null 
); 

ここでの問題は、そのMockito.matches()は、それがために見えるということであることが表示されます実際のシグネチャが(Object、Throwable)の場合は、signature(String、Throwable)を持つメソッド

これらはどのように一致させることができますか? Mockito.any()Mockito.matches()を置き換えると、文字列が問題であることがわかります。

+0

...なんだか不自然かもしれないが、それはとにかくもう少し近くにあなたを取得する必要がありますMockito.matchesへのあなたの議論からのアスタリスク?私はそれが正規表現を一致させるかもしれないと思っている。 – unigeek

+1

あなたのケースで[ArgumentCaptor](http://site.mockito.org/mockito/docs/current/org/mockito/ArgumentCaptor.html)がオプションになる可能性があります – Mindaugas

+0

私はArgumentCaptorを試してみましたが、役に立たなかった: '引数(s)は異なる!募集: log.error( [email protected]、 ヌル );アスタリスクを除去するために同じ ' – Steve

答えて

1

ここで例が役立つかもしれません。あなたがこれを理解できるかどうかを見てください。あなたが大手を削除し、末尾の場合に何が起こるか

Main.java

package com.company; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

public class Main { 
    private static Log log = LogFactory.getLog(Main.class); 

    public Main(Log l) { 
     this.log = l; 
    } 

    public static void main(String[] args) { 
     Main m = new Main(log); 
     m.go(); 
    } 

    public void go() { 
     log.info("this is a test of the emergency broadcasting system.", null); 
    } 
} 

MainTest.java

package com.company; 

import org.apache.commons.logging.Log; 
import org.junit.Test; 
import org.mockito.Mockito; 

import static org.mockito.Matchers.*; 

public class MainTest { 
    Log mockLogger = (Log) Mockito.mock(Log.class); 

    private Main testSubject = new Main(mockLogger); 

    @Test 
    public void should_use_logger() { 
     //Mockito.doNothing().when(mockLogger).info(anyString(), any()); 
     testSubject.go(); 
     Mockito.verify(mockLogger, Mockito.times(1)).info(contains("emergency broadcasting"), isNull(Throwable.class)); 
    } 
} 
関連する問題