2013-12-19 114 views
1

我有這樣的方法,我試圖模擬:如何使用Mockito匹配2d數組參數?

public class Dog { 
    public String foo(String a, String[][] headers); 
} 

我想回bar時​​叫做:

Dog dog = mock(Dog.class); 
when(dog.foo("hello", new String[][]{{"a", "b"}})).thenReturn("bar"); 

然而,這並不工作,因爲使用的Mockito匹配equals()時陣列,並且因爲它們不指向相同的對象,所以它失敗:

// prints null instead of bar 
System.out.println(dog.foo("hello", new String[][]{{"a", "b"}})); 

請注意代碼被測試將無法訪問用作#when匹配參數的對象。有什麼辦法可以解決這個問題?

+0

我相信你的問題是你的實現中的數組不是同一個實例。嘗試將數組賦值給變量,並在「when」和「dog.foo」調用中使用該變量。 – Nodebody

+0

是的,這就是問題所在,然而被測試的代碼將調用dog.foo與這些參數將無法訪問數組變量。它必須構建一個具有相同值的新數組。 – Popcorn

回答

3

嘗試使用匹配器:

@Test 
public void testsss() { 
    Dog dog = Mockito.mock(Dog.class); 
    Matcher<String[][]> matcher = new BaseMatcher<String[][]>() { 
     @Override 
     public boolean matches(Object item) { 
      return true; 
     } 
     @Override 
     public void describeTo(Description description) { 
     } 
    }; 
    Mockito.when(dog.foo(Mockito.eq("hello"), Mockito.argThat(matcher))).thenReturn("bar"); 

    Assert.assertEquals("bar", (dog.foo("hello", new String[][] { { "a", "b" } }))); 
} 

只是實現自己的比賽方式,而不是返回真;)

+1

+1;你可能會發現[Arrays.deepEquals](http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#deepEquals%28java.lang.Object [],%20java.lang。對象[]%29)在這裏很有幫助。 –

0

你可以試試在類犬的直列壓倒一切:

Dog dog = new Dog() 
    { 
     public String foo(String a, String[][] headers){ 
    if (headers[0].equals("a") && headers[0].equals("b")) return "bar"; 
    } 
} 

然後運行你對狗的測試。 我知道肯定有另一種使用Mockito方法的解決方案,但不記得語法。

相關問題