当前位置: 首页 > 知识库问答 >
问题:

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

宇文迪
2023-03-14

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

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

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

另一类是:

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

我在嘲笑我在测试课上学到的方法。我曾尝试使用doReturn,而不是其他帖子中建议的Return,但没有帮助。

我的测试课程是:

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个答案

景同
2023-03-14

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

  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);
     }
  }

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

史高阳
2023-03-14

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

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

我不明白为什么还在调用真正的某些方法()。原来这个方法被指定为最终方法。Mockito不能嘲笑静态或最终方法。

 类似资料:
  • 这是我的实际服务方法。在测试时,它给我的变量为空。用户和响应 我试图写一个测试用例和模拟方法findByEmail()和保存(),但同时嘲笑我没有收到用户对象在返回中提到的thenback()和doback()。 有人能帮忙吗。

  • 我遇到了Mockito的一个bug,但我想知道是否有其他人可以解释为什么这个测试不起作用。 基本上,我有两个对象,如下所示: 第一个对象是通过注释和之前的方法模拟的: 在方法中模拟第二个对象: 当包含对此方法的直接调用以设置并获取第二个对象的模拟时,它将失败: 但是,当同一方法返回的模拟被分配给一个局部变量(在中使用)时,它可以工作: 我们是否做错了什么,或者这确实是Mockito中的一个缺陷/限

  • 我目前正在学习Spring boot,我一直在测试一个项目——非常感谢任何帮助,因为我是这里的初学者。 我有一个rest控制器测试,使用Mockito,当使用Mockito.when()调用方法时,该测试似乎忽略了Then返回。 这是整个班级: 名为“testCreateUser”的测试没有问题地通过了。给我一个问题的是名为“testFindUserById”的测试。 以下是我尝试测试的控制器方法

  • 我试图验证在使用powerMockito 1.6.4测试服务方法时从未调用过静态方法 我按照这个答案做了同样的事情。 以下是我的代码。 我现在面临的问题是,调用real并给出nullPointerException。 我的假设是与一起工作,以便指定要验证的静态方法。 我错过什么了吗?

  • 问题内容: 我正在尝试使用“ any”匹配器对这个getKeyFromStream方法进行存根。我尝试了更明确和不太明确的(anyObject()),但似乎无论我如何尝试,此存根都不会在我的单元测试中返回fooKey。 我想知道是否是因为它受到保护,或者我缺少其他东西或做错了什么。在整个测试中,我还有其他的when / then语句在 起作用, 但是由于某种原因,事实并非如此。 注意:getKey

  • 我是Scala新手,正在为Scala中的Play应用程序编写一些测试。Play应用程序已经用Java编写。 我有一个有一个公共方法进程的刷新服务 其中动作在另一个包中定义为POJO 我已经根据Scala指南编写了测试 当试图模拟此服务时,我使用了以下代码 我从Scala得到以下编译器错误,无法弄清楚这些类型如何是矛盾的 [错误]/home/joey/Projects/sntdb/test/cont