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

Mockito在嵌套mock中的方法上不做任何操作

盖夕
2023-03-14

假设我有3个类,ClassA包含ClassB,ClassC包含ClassB。我试图在ClassA中测试一个方法,该方法需要调用ClassB来获取ClassC的实例,并在ClassC中执行一个无效的方法(我知道这是错误的,因为ClassA不应该知道ClassC,代码气味,这不是我的代码,只是试图创建一个测试)。然而,当我尝试使用Mockito跳过该方法调用时。无论怎样,我都会遇到以下错误:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, you naughty developer!
 3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed

这是代码

A类:

    public class ClassA {
        private ClassB classB;

        public ClassA(ClassB classB) {
            this.classB = classB;
        }

        public void methodToTest() {
            classB.getClassC().someVoidMethod("123");
        }
    }

B类:

    public class ClassB {
        private ClassC classC;

        public ClassB(ClassC classC) {
            this.classC = classC;
        }

        public ClassC getClassC() {
            return classC;
        }

    }

C类:

    public class ClassC {
        public void someVoidMethod(String arg) {
            System.out.println(arg);
        }
    }

考试班

    @RunWith(MockitoJUnitRunner.class)
    public class ClassATest {

        @InjectMocks
        private ClassA classA;

        @Mock(answer = Answers.RETURNS_DEEP_STUBS)
        private ClassB classB;

        @Mock
        private ClassC classC;

        @Test
        public void test() {
            Mockito.doNothing().when(classB.getClassC()).someVoidMethod("123");
        }    
    }

再说一次,这段代码不是我的,所以我不能修改它使用依赖关系的方式。我只是想测试一下。

提示:Mockito。当(…)。然后返回(…)很好,但这不是我的情况,因为我试图模仿的方法是无效的。

共有2个答案

慕迪
2023-03-14

您的mocking语法排列不当。

Mockito.doNothing().when(classB.getClassC()).someVoidMethod("123");

当你将空格添加到这个语句的各个部分时,这是显而易见的。

Mockito      response                    method                  method
Mockito      .doNothing()     .when(classB.getClassC())    .someVoidMethod("123");

当您将一个METHOD传递给当时时,它期望一个然后返回当您将一个OBJECT传递给当时时,您可以从中链接一个无效方法。

Mockito.when(classB.getClassC()).thenReturn(classC);
Mockito.doNothing().when(classC).someVoidMethod("123");

这不能像你想象的那样工作是因为classB。getClassC()在通过when()时不像getter那样工作。

实际上,您并没有将对对象的引用传递给Mockito,而是Mockito将使用为您存根的方法,它抱怨缺少该方法,因为您没有一个。

tl: dr;

不要像对待mockito存根代码中的实际方法那样对待模拟对象方法。

袁桐
2023-03-14

我认为这行得通。我不知道为什么你不能使用class B. getClassC()而不是直接引用class C

@RunWith(MockitoJUnitRunner.class)
public class ClassATest {

  @InjectMocks
  private ClassA classA;

  @Mock(answer = Answers.RETURNS_DEEP_STUBS)
  private ClassB classB;

  @Mock
  private ClassC classC;

  @Before
  public void init() {
    doReturn(classC).when(classB).getClassC();
    doNothing().when(classC).someVoidMethod("123");
  }

  @Test
  public void test() {
    classA.methodToTest();
  }
}
 类似资料:
  • 此代码在控制台中有以下输出: Method1 Method2 Method3 而我希望它是 Method1 Method2 Mock method3 方法3被嘲弄了,那么为什么它没有被调用呢?

  • 1、后端开发代码 public void methodA(){ } 2、测试方法代码 public void methodATest(){ Mockito.when(mapper.insert(Mockito.any())).thenReturn(1); xxx.methodA(); Mockito.when(mapper.insert(Mockito.any())).thenThrow(Runt

  • 如果我们不想付出构建语法分析树的开销,或者想要在分析期间动态地计算值或把东西打印出来,那么可以通过在语法中嵌入任意代码实现。它的比较困难的,因为我们必须明白在语法分析器上的操作的影响,以及在哪里放置这些操作。 为了解释嵌入在语法中的操作,让我们先来看下文件rows.txt中的数据: parrt Terence Parr 101 tombu Tom Burns 020 bk

  • 我想通过模拟class的重写方法a1方法2来测试我的服务。我不想更改课程A1和B1中的任何内容。我使用的是mockito 1.9.0和powermockito 1.4.12。我正在尝试以下代码: UnitTestService类: 服务级别: A1类: B1级: 我正在eclipse中使用testNG运行类UnitTestService。在这里,B1类a1Method2中的实际方法在控制台中打印“

  • 问题内容: 我有四个让我们说A,B,C,D的类,每个类都从另一个调用方法。 现在我已经模拟了类A,并且想模拟使用嘲笑的方法 并希望在递归方法调用上获取“ foo” 应该回来 我试过了 when(a.getB()。getC()。getD())。thenReturn(“ foo”); 但是得到了nullPointerException 然后我尝试 doReturn(“ foo”)。when(a.get

  • 我有4个类让说A,B,C,D,每一个调用的方法从另一个。 现在我已经模拟了类A,并想使用mockito模拟一个方法 但得到nullPointerException 然后我试着 doReturn(“foo”).When(A.getb().getc().getd()); 但我不能一次就做到吗?如有任何帮助,我们将不胜感激。