Почему сопоставители типа Mockito соответствуют несвязанным объектам?
Мне нужно, чтобы поведение макета зависело от типа аргумента.
Я попытался использовать Matchers.any(Class<>)
, чтобы обеспечить два вида поведения:
public class MockitoTest {
public interface ToMock {
String accept(Object object);
}
interface A {
}
interface B {
}
@Test
public void doAnswer() {
ToMock mock = Mockito.mock(ToMock.class);
Mockito.doReturn("A received").when(mock).accept(Matchers.any(A.class));
Mockito.doReturn("B received").when(mock).accept(Matchers.any(B.class));
Assert.assertEquals("A received", mock.accept(new A() {}));
Assert.assertEquals("B received", mock.accept(new B() {}));
}
}
Тест не проходит с:
org.junit.ComparisonFailure: expected:<[A] received> but was:<[B] received>
Что я делаю не так?
Mockito версии 1.9.5
1 ответ:
Это ожидаемое поведение. В соответствии с документацией
Matchers.any(Class)
Любой вид объекта, не обязательно данного класса. Аргумент класса предоставляется только для того, чтобы избежать приведения.