Как заглушить метод с помощью Mockito в java - PullRequest
0 голосов
/ 29 января 2020

У меня есть одноэлементный класс S, который реализует интерфейс I. У одноэлементного класса есть метод A, который inturn вызывает метод B. Я должен проверить метод A.

Это мой одноэлементный класс

        public class S implements I{
           private static S INSTANCE = new S();

           public static I getInstance(){
             return INSTANCE;
           }

           public String methodA(){
              methodB();
           }
         }

Вот так выглядит мой метод в тестовом классе.

public void testMethodA(){
S so = S.getInstance();
S spy = Mockito.spy(so);
Mockito.doReturn(something).when(spy).methodB(); // I have to cut the dependency of this method B, hence will stub this 
String exp_value = 'X';
assertEquals(exp_value,spy.methodA);
}

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

1 Ответ

0 голосов
/ 29 января 2020

Ваш код с несколькими изменениями компилируется и запускается, как и ожидалось. Вот автономный работающий пример.

public class StackOverflow59960713 {
    public interface I {
        String methodA();
    }

    public static class S implements I {
        private static S INSTANCE = new S();

        public static I getInstance() {
            return INSTANCE;
        }

        public String methodA() {
            return methodB();
        }

        public String methodB() {
            return "abc";
        }

    }

    @Test
    public void testMethodA() {
        S so = (S) S.getInstance();  <== getInstance() returns I not S
        S spy = Mockito.spy(so);
        Mockito.doReturn("123").when(spy).methodB();

        String exp_value = "123";
        assertEquals(exp_value, spy.methodA());  <=== methodA() not methodA
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...