2017-07-10 39 views
0

我有一個相當龐大的代碼庫。其中一個測試類正在使用導入語句,該語句在編譯期間失敗以進行以下靜態導入。它在導入語句以及實際調用constainsString()的地方失敗。JUnitMatchers.containsString的靜態導入工作,但不是CoreMatchers.containsString

import static org.hamcrest.CoreMatchers.containsString; 

確切的錯誤如下:

[ERROR] MyClassName:[...] error: cannot find symbol 
[ERROR] symbol: method containsString(String) 
[ERROR] location: class MyClassName 

改變上述靜態導入到JUnitMatchers.containsString修復該問題:

import static org.junit.matchers.JUnitMatchers.containsString; 

我有效的pom.xml有以下相關依賴關係:

junit:jUnit:4.11 
org.hamcrest:hamcrest-all:1.1 
org.mockito:mockito-all:1.9.5 

所以,問題真的是

  1. 爲什麼JUnitMatchers.containsString成功的,但實際上它有利於CoreMatchers.containsString被棄用?
  2. 如果它提取任何庫的錯誤版本,我們如何讓maven使用正確的版本?

回答

2

Hamcrest 1.1沒有containsString方法。找不到源(顯然,按照該comment on this commit,先前所生成的類),但是我們可以使用反編譯的類:

public class CoreMatchers { 
    public static <T> Matcher<T> is(Matcher<T> matcher) { 
     return Is.is(matcher); 
    } 

    public static <T> Matcher<T> is(T value) { 
     return Is.is(value); 
    } 

    public static Matcher<Object> is(Class<?> type) { 
     return Is.is(type); 
    } 

    public static <T> Matcher<T> not(Matcher<T> matcher) { 
     return IsNot.not(matcher); 
    } 

    public static <T> Matcher<T> not(T value) { 
     return IsNot.not(value); 
    } 

    public static <T> Matcher<T> equalTo(T operand) { 
     return IsEqual.equalTo(operand); 
    } 

    public static Matcher<Object> instanceOf(Class<?> type) { 
     return IsInstanceOf.instanceOf(type); 
    } 

    public static <T> Matcher<T> allOf(Matcher... matchers) { 
     return AllOf.allOf(matchers); 
    } 

    public static <T> Matcher<T> allOf(Iterable<Matcher<? extends T>> matchers) { 
     return AllOf.allOf(matchers); 
    } 

    public static <T> Matcher<T> anyOf(Matcher... matchers) { 
     return AnyOf.anyOf(matchers); 
    } 

    public static <T> Matcher<T> anyOf(Iterable<Matcher<? extends T>> matchers) { 
     return AnyOf.anyOf(matchers); 
    } 

    public static <T> Matcher<T> sameInstance(T object) { 
     return IsSame.sameInstance(object); 
    } 

    public static <T> Matcher<T> anything() { 
     return IsAnything.anything(); 
    } 

    public static <T> Matcher<T> anything(String description) { 
     return IsAnything.anything(description); 
    } 

    public static <T> Matcher<T> any(Class<T> type) { 
     return IsAnything.any(type); 
    } 

    public static <T> Matcher<T> nullValue() { 
     return IsNull.nullValue(); 
    } 

    public static <T> Matcher<T> nullValue(Class<T> type) { 
     return IsNull.nullValue(type); 
    } 

    public static <T> Matcher<T> notNullValue() { 
     return IsNull.notNullValue(); 
    } 

    public static <T> Matcher<T> notNullValue(Class<T> type) { 
     return IsNull.notNullValue(type); 
    } 

    public static <T> Matcher<T> describedAs(String description, Matcher<T> matcher, Object... values) { 
     return DescribedAs.describedAs(description, matcher, values); 
    } 
} 

無法在中央回購找到1.2版,but 1.3確實定義該方法(和其他一些)。

JUnit 4.11(和4.12)已經引用了Hamcrest 1.3,但mockito-1.9.5 references v1.1(滾動到依賴關係)。您還可以通過運行mvn dependency:tree看到這一點:

[INFO] \- org.mockito:mockito-core:jar:1.9.5:compile 
[INFO] +- org.hamcrest:hamcrest-core:jar:1.1:compile 
[INFO] \- org.objenesis:objenesis:jar:1.0:compile 

--------------- 

[INFO] +- junit:junit:jar:4.11:compile 
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:compile 

沒有看到實際的POM我不能說怎麼樣,但不知何故,1.1版的優先級高於1.3,無論是明確的,或者也許是的Mockito宣佈在你的POM之前JUnit的。所以,你可以嘗試換你的POM的JUnit和秩序的Mockito,或明確定義Hamcrest 1.3直接覆蓋的傳遞版本:

<dependency> 
    <groupId>org.hamcrest</groupId> 
    <artifactId>hamcrest-all</artifactId> 
    <version>1.3</version> 
    <scope>test</scope> 
</dependency>