2016-02-28 32 views
1

我得到的錯誤信息:「使用無效的說法匹配器」,但是我用的匹配唯一

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 無效使用參數匹配器! 0的匹配預期的,1記載: - >在* .SegmentExportingTest.happyDay(SegmentExportingTest.java:37) 可能會發生此異常,如果匹配器與原始值組合: //不正確的: 的someMethod(anyObject(),「原始字符串「); 使用匹配器時,所有參數必須由匹配器提供。 例如: //正確: 的someMethod(anyObject(),當量( 「字符串由匹配器」));

但實際上我只在該方法的參數中使用匹配器。

下一個代碼是上述錯誤的來源。

ConfigReader configReader = mock(ConfigReader.class); 
    when(configReader.getSparkConfig()) 
      .thenReturn(new SparkConf().setMaster("local[2]").setAppName("app")); 
    when(configReader.getHBaseConfiguration()).thenReturn(new Configuration()); 

    SparkProfilesReader sparkProfilesReader = mock(SparkProfilesReader.class); 
    ProfileSegmentExporter profileSegmentExporter = mock(ProfileSegmentExporter.class); 

    //-- 
    new SegmentExporting().process(configReader, sparkProfilesReader, profileSegmentExporter); 
    //-- 

    InOrder inOrder = inOrder(sparkProfilesReader, profileSegmentExporter); 
    inOrder.verify(sparkProfilesReader).readProfiles(any(JavaSparkContext.class), 
      refEq(configReader.getHBaseConfiguration())); 
+1

問題解決了。我在單獨的行中提取了configReader.getHBaseConfiguration(),並且隱藏了問題。 –

回答

4

在評論中解決:

我在單獨的行提取configReader.getHBaseConfiguration()和問題被牆根。

你的具體問題是:你調用設置您的匹配中間的模擬方法。


這兩條線指示的問題是這些:

when(configReader.getHBaseConfiguration()).thenReturn(new Configuration()); 
// ... 
inOrder.verify(sparkProfilesReader).readProfiles(any(JavaSparkContext.class), 
    refEq(configReader.getHBaseConfiguration())); 

正如我在a previous SO post寫道的Mockito匹配器通過副作用工作居多,所以叫匹配器方法和模型對象的方法中爲了對Mockito及其驗證非常重要。對configReader.getHBaseConfiguration()的調用是在調用any(JavaSparkContext.class)之後發生的模擬調用(如第一行中所建立的),這會讓Mockito認爲您正在驗證any匹配的一個參數的零參數方法getHBaseConfiguration。這就是爲什麼錯誤消息顯示「0 matchers預期,1記錄」:0是getHBaseConfiguration和1是any(JavaSparkContext.class)

爲了安全起見,使用匹配器的Mockito時,確保傳遞給匹配器的值都是預先計算的:他們都應該是恆定的文字,簡單的數學表達式或變量。任何涉及方法調用的事情都應在提取/驗證開始之前提取到局部變量中。