Почему сопоставители типа 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 2

1 ответ:

Это ожидаемое поведение. В соответствии с документацией Matchers.any(Class)

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