Подтвердить что ты не робот

Mockito: когда вызывается метод A.a, тогда выполните B.b

Я использую Mockito для тестов JUnit. Таким образом, существует определенный класс A, который используется из кода, который я хочу проверить:

class A{

    public A(){}

    public final String a(String x){
        return "A.a: " + x;
    }

}

и я хочу заменить вызов метода A.a другим вызовом метода с теми же аргументами и возвращаемым значением того же типа. Как вы можете видеть, невозможно переопределить метод a, расширив класс как окончательный. Итак, теперь у меня есть другой класс B с методом B.b:

class B{

    public B(){}

    public String b(String x){
        return "B.b: " + x;
    }

}

Теперь я хочу убедиться, что каждый раз, когда вызывается A.a из кода, вместо этого используется возвращаемое значение B.b. Есть ли возможность достичь этого с помощью Mockito (что-то вроде Mockito.when(A.a(x)).thenReturn(B.b(x));), но с тем же параметром x, не зная значения x?

Любая помощь будет оценена, спасибо заранее!

4b9b3361

Ответ 1

Невозможно переопределить окончательные методы для mockito-генерируемых mocks, согласно ограничениям Mockito. Но вы можете использовать Powermock, чтобы взломать код во время выполнения, чтобы Mockito мог выполнять свою работу.

Ответ 2

Хорошо mockito mocks работает, расширяя класс и переопределяя метод, который в вашем случае невозможен при A.a(String). Если вы хотите, чтобы это произошло, вам нужно удалить последний модификатор.

Теперь, если A.a(String) не является окончательным, то, что вы просите, полностью выполнимо с помощью mockito:

given(mockA.a(anyString()).willAnswer(returnOfB(bInstance));

Answer<String> returnOfB(final B bInstance) {
    return new Answer<String>() {
         public String answer(Invocation invocation) {
             String arg = (String) invocation.getActualArguments()[0];
             return bInstance.b(arg);
         }
    };
}

Обратите внимание, что этот ответ написан на телефоне и может иметь опечатку или неправильные имена, хотя вы должны получить представление о том, что нужно сделать для достижения желаемого.

Приветствия

Ответ 3

В основном я взял вашу настройку и написал с ней Unit-Test. Сначала появилось сообщение об ошибке, в котором это явно указано:

org.mockito.exceptions.misusing.MissingMethodInvocationException: когда() требует аргумент, который должен быть "вызовом метода на макет".

И позже в трассировке говорится, что "вы заглушаете либо из методов final/private/equals()/hashCode(). Эти методы не могут быть зашиты/проверены".

Итак, согласно Мокито, вы не можете заглушить окончательные методы, и это так.

Изменить: вам нужно либо удалить окончательный модификатор, либо, если вы застряли с этим классом, как есть, найдите другой способ.