【问题标题】:Mockito is calling real method and thenReturn does not workMockito 正在调用真实方法,然后返回不起作用
【发布时间】:2020-01-15 23:13:55
【问题描述】:

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

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 时我没有得到真实的结果?这里有什么问题?

【问题讨论】:

标签: junit mockito


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    1. 您可以将代码改写为:

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

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

    使用 mockito 库中的 spy 创建 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);
         }
      }
    

    关于 mockito 中 spy 的更多信息。 Spy 使用真实实例并调用真实方法,但提供模拟特定方法的功能。不要担心其他方法会继续与实际实现一起工作,只有模拟方法会受到影响。

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

    【讨论】:

      猜你喜欢
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多