Mockito вызывает реальный метод, а затем Return не работает - PullRequest
0 голосов
/ 25 сентября 2018

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

Class SingletonClass
{
     public static SingletonClass instance()
     {
           ......
           return instance;
     }

     public boolean methodToBeMocked(Object obj)
     {
          return false;
     }
}

И еще один класс:

Class A
{
      Object doSomeStuff()
      {
            ......
            boolean result = SingletonClass.instance.methodToBeMocked();
      }
}

И я издеваюсь над методом methodToBeMocked в моем тестовом классе.Я попытался использовать doReturn вместо thenReturn, как это предлагается в других статьях, но это не помогло.

Мой тестовый класс:

Class TestClass{

     Class A a = new A();

     public void test()
     {
          SingletonClass singletonClass = mock(SingletonClass.class);
          doReturn(true).when(singletonClass).methodToBeMocked(any());

          a.doSomeStuff(); // here mocked method returns false

          // but if I do this below it returns true !!!!
          Object obj = new Object();
          boolean result = singletonClass.mockedMethod(obj);
     }
}

Так почему я не понимаю, когдаa.doSomeStuff называется?Что здесь не так?

1 Ответ

0 голосов
/ 27 сентября 2018

Проблема в статическом методе public static SingletonClass instance().Стандартная библиотека mockito не поддерживает моделирование статических методов.Я видел два решения.

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

Добавить новый метод getSingletonClassInstance () для проверки в тесте

Class A {
       Object doSomeStuff()
       {
             ......
             boolean result = getSingletonClassInstance();
       }

       SingletonClass getSingletonClassInstance(){
             return SingletonClass.instance.methodToBeMocked();
       } 
}

использование шпиона из библиотеки mockito для создания экземпляра класса A

import static org.mockito.Mockito.spy;.....

Class TestClass{

     public void test()
     {
          Class A a = spy(new A());
          SingletonClass singletonClass = mock(SingletonClass.class);
          doReturn(true).when(singletonClass).methodToBeMocked(any());

          doReturn(singletonClass).when(a).getSingletonClassInstance();

          a.doSomeStuff(); // here mocked method returns false

          // but if I do this below it returns true !!!!
          Object obj = new Object();
          boolean result = singletonClass.mockedMethod(obj);
     }
  }

Больше информации о шпион в мокито.Шпион использовал реальный экземпляр и вызывает реальный метод, но предоставляет функциональность для насмешки конкретного метода.Не беспокойтесь о других методах, которые они будут продолжать работать с реальной реализацией, затронут только проверенный метод.

Вы можете использовать power mockito , чтобы высмеивать public static SingletonClass instance()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...