Junit Mockito正在调用real方法,然后返回不起作用

Junit Mockito正在调用real方法,然后返回不起作用,junit,mockito,Junit,Mockito,我读过一些关于它的帖子,但没有解决我的问题。我有一个单例类,这个类的一个方法在另一个类中被调用。我需要模拟这个方法调用 Class SingletonClass { public static SingletonClass instance() { ...... return instance; } public boolean methodToBeMocked(Object obj) {

我读过一些关于它的帖子,但没有解决我的问题。我有一个单例类,这个类的一个方法在另一个类中被调用。我需要模拟这个方法调用

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

     public boolean methodToBeMocked(Object obj)
     {
          return false;
     }
}
另一类是:

Class A
{
      Object doSomeStuff()
      {
            ......
            boolean result = SingletonClass.instance.methodToBeMocked();
      }
}
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);
     }
}
我在模仿我的测试类中的方法。我曾尝试使用doReturn,而不是其他帖子中建议的Return,但没有任何帮助

我的测试班是:

Class A
{
      Object doSomeStuff()
      {
            ......
            boolean result = SingletonClass.instance.methodToBeMocked();
      }
}
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时没有实现呢?这里出了什么问题?

问题是静态方法
公共静态SingletonClass实例()
。标准mockito库不支持静态方法的模拟。我看到了两种解决方案

  • 您可以将代码重写为:
  • 添加要在测试中模拟的新方法getSingletonClassInstance()

    使用mockito库中的spy创建类A的实例

    导入静态org.mockito.mockito.spy;

    更多关于mockito中的应用程序的信息。Spy使用了真实实例和调用真实方法,但提供了模拟特定方法的功能。不要担心其他方法,它们将继续使用真正的实现,只有模拟方法会受到影响

  • 您可以使用来模拟
    公共静态单例类
    实例()

  • 为了其他人的利益,我使用下面的mock时希望它不会调用someMock.someMethod(),这与when(someMock.someMethod()).doReturn(“someString”)用法不同


    我不明白为什么仍在调用真正的someMethod()。结果表明,该方法被指定为final。Mockito无法模拟静态或最终方法。

    在这里找到了答案,模拟singleton。可能重复的
    Mockito.doReturn("someString").when(someMock).someMethod();