2013-12-19 3 views
1

У меня есть этот метод я пытаюсь издеваться:Как я могу сопоставить аргументы массива 2d с помощью Mockito?

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

Я хотел бы вернуться bar когда foo("hello", new String[][]{{"a", "b"}}) называется:

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

Я считаю, что ваша проблема заключается в том, что массивы в вашей реализации не являются одним и тем же экземпляром. Попробуйте назначить массив переменной и использовать эту переменную в «когда», а также в вызове «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 dog = new Dog() 
    { 
     public String foo(String a, String[][] headers){ 
    if (headers[0].equals("a") && headers[0].equals("b")) return "bar"; 
    } 
} 

затем запустить ваш тест на собаке. Я точно знаю, что есть другое решение, использующее методы Mockito, но не могу вспомнить синтаксис.

Смежные вопросы