Mockito正在调用实际方法,然后返回不起作用

时间:2018-09-25 14:56:10

标签: junit mockito

我已经阅读了有关它的文章,但没有任何解决我的问题的方法。我有一个单例类,该类的一个方法在另一个类中被调用。我需要模拟这个方法调用。

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时我无法理解?这是怎么了?

2 个答案:

答案 0 :(得分:0)

问题是静态方法public static SingletonClass instance()。标准的模仿库不支持静态方法的模仿。我看到了两种解决方案。

  1. 您可以将小的代码重写为:
  

添加新方法getSingletonClassInstance()以在测试中进行模拟

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

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

使用来自模仿库的间谍创建A类实例

导入静态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);
     }
  }

有关嘲笑spy的更多信息。间谍使用了真实实例并调用了真实方法,但提供了模拟特定方法的功能。不必担心其他方法会继续与实际实现一起使用,只会影响模拟方法。

  1. 您可以使用power mockito模拟public static SingletonClass instance()

答案 1 :(得分:0)

为了他人的利益,我使用以下模拟程序,期望它不会调用someMock.someMethod(),这与when(someMock.someMethod())。doReturn(“ someString”)用法不同。

Mockito.doReturn("someString").when(someMock).someMethod();

我不明白为什么仍然要调用真正的someMethod()。事实证明该方法被指定为 final 。 Mockito无法模拟静态或最终方法。