2016-06-08 4 views
-1

Когда я шпионил за классом, он также шпионит за всеми членами этого класса? Например, скажем, я делаю класс Pair и проверяю реализацию toString (не лучший пример всего времени).Mockito spy: также шпионить за членами?

public class Pair<L,R> { 
    L left; 
    R right; 
    // ... getters setters etc 
    public String toString() { 
     return "(" + getLeft() + ", " + getRight() + ")"; 
    } 
} 

Скажите, что я хочу обеспечить, чтобы как левое, так и правое название вызывали toString.

@Test 
public void testToString() { 
    classUnderTest = spy(new Pair<>(...)); 
    String str = classUnderTest.toString(); 

    verify(classUnderTest.getLeft()).toString(); // does it actually verify? 
    verify(classUnderTest.getRight()).toString(); 
} 
+1

Что происходит, когда вы его проверяете? Прочтите, прежде чем делать: https://github.com/mockito/mockito/wiki/FAQ#can-i-verify-tostring –

+0

@Compass нет, это правильно, как есть. –

+0

@JBNizet - они проходят. Прочитав еще несколько, это выглядит так, как будто это ведет себя так, как ожидалось. Я не знал, что проверка завершилась неудачно, если вы не передали ей макет/шпион. toString здесь был всего лишь примером, мой реальный код отличается. – twentylemon

ответ

0

Вы не можете подтвердить, что toString() метод вызова. Для получения более подробной информации см. documentation.

Однако, если вы хотите, чтобы убедиться, что при вызове toString(), методы getLeft() и getRight называются, вы можете написать что-то вроде этого:

@Test 
    public void whenPrintingPairBothPartsAreRequested() { 
     Pair<String, Integer> pair = new Pair<>(); 
     pair = spy(pair); 

     verify(pair).getLeft(); 
     verify(pair).getRight(); 
    } 

EDIT: Нет, шпионит объект выиграл» t spy все его члены, если вы явно не установите объект объекта в качестве шпиона.

Причина, по которой это хорошо работает в вашем примере, является просто совпадением.

Когда вы пишете verify(pair.getLeft()).toString(), это на самом деле eq до verify(pair.getLeft()) (так, toString() будет проигнорирован). Но не путайте: это не toString() на парном объекте. Это toString() этого левого объекта внутри парного объекта.

public static <T> T verify(T mock) - это знак способа проверки. Итак, если вы проверяете verify(pair.getLeft()), то возвращается pair.getLeft(). И после этого вы вызываете на него toString(), что не имеет смысла и не влияет на результаты тестирования.

+0

Очевидно, что toString - плохой пример. Мой реальный код не тестирует toString, а не члены имеют свой собственный метод конвертации, когда владелец преобразуется. – twentylemon

+0

@twentylemon, получил его, взгляните на мое редактирование. –

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