繁体   English   中英

如何模拟正在被同一类测试的另一个方法内部调用的类的方法?

[英]How to mock a method of a class being called inside another method that is being tested of the same class?

例如,有一个带有两个方法methodUnderTest()和display()的类A,其中methodUnderTest调用显示方法。 使用Mockito编写junit时,如何模拟display()方法?

class A{
public int method methodUnderTest{
   //some code
   display();
}

public int display(){
  //some code
}

}

如果这是您的课程:

    public static class A{
        public int methodUnderTest() {
            return display();
        }

        public int display(){
            return 1;
        }
    }

然后使用模仿,您可以执行以下操作:

        A a = spy(new A());
        when(a.display()).thenReturn(0);
        System.out.println(a.methodUnderTest()); // will print 0

说明:

当您mock()一个类时,没有基础实例,并且您调用的所有方法将不执行任何操作并返回默认值,除非另行指定。

当您在实例上执行spy()时,所有调用都会被记录,并转发到实际实例 这意味着除非您模拟特定的调用,否则您的类行为将保持完全相同。


话虽如此,像您这样的情况通常是一种症状,您需要拆分班级,并花点时间来分离您的问题

您不需要它的模仿。 在测试中,当您创建测试对象时,可以通过以下方式创建它:

A underTest = new A() {
    @Override
    public int display() {
        return <expected result>
    }
}

这样,您可以控制display方法返回哪种类型的值。

如果您想使用模仿,我会选择这样的东西:

@Mock
private A a;

@Test
public void test() {    

    //define the behaviour
    Mockito.when(a.display()).thenReturn(12);

    // call methodUnderTest
    int res = a.methodUnderTest();

    // check that you get what you want
    Assert.assertEquals(SOME_VALUE, res);

}

如果你不想使用注释,你会初始化a这样的:

A a = Mockito.spy(new A());

HTH!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM