2015-06-05 3 views
1

я не могу легко проверить, 2 индивидуальные и уникальный вызов класса подтипа к способу, который принимает супертипMockito Проверки на пропускаемом типе югу видит только супер тип

У меня есть сценарий, который действует, как это ...

Оба В и с, расширить абстрактный тип A

с

public class X { 
    public String doSomething(A a){ 
     return ""; 
    } 
} 

Тест

@Test 
public void testExtensionVerify(){ 
X x = mock(X.class); 
B b = new B(); 
C c = new C(); 
x.doSomething(b); 
x.doSomething(c); 

verify(x, times(1)).doSomething(any(B.class)); //fails. 
} 

VERIFY раз (1) не ... Он видит 2 вызова вместо 1, вероятно, потому, что ссылка Б в сигнатуре метода является супер типа А.

Проблема заключается в том, что я не могу проверить каждый вызов однозначно

Я знаю, что могу использовать swtich для eq (b) и eq (c) вместо any(), но у меня нет дескриптора для них в моем реальном случае, поскольку они созданы в тестируемом объекте. Другой вариант может состоять в том, чтобы сделать ArgumentCaptor и протестировать экземпляр, но его раздражает.

Любые другие решения?

ответ

1

Вы можете использовать isA:

verify(x, times(1)).doSomething(isA(B.class)); 

http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/Matchers.html

ЛЮБЫМ семейные методы не делать каких-либо проверок типа те, которые только здесь, чтобы избежать литья в вашем коде. Если вы хотите выполнить проверки типов, используйте метод isA (Class). Однако это может измениться (проверки типа могут быть добавлены) в будущем выпуске.

public class XTest { 
    @Test 
    public void testExtensionVerify(){ 
    X x = mock(X.class); 
    B b = new B(); 
    C c = new C(); 
    x.doSomething(b); 
    x.doSomething(c); 

    verify(x, times(1)).doSomething(isA(B.class)); 
    verify(x, times(1)).doSomething(isA(C.class)); 
    } 
} 
+0

Ах да. Отлично. благодаря –

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