首页 > 解决方案 > 模拟从多个方法调用的方法

问题描述

所以我的代码看起来像这样

class One
{
   private final Two two;
   public One()
   {
       two = new Two(this)
   }
   public void method1()
   {
       //do something
       method2();
   }
   public void method2()
   {
       //do something
       two.method3();
    }
}

class Two
{
    private final One one;
    public Two(One one)
    {
        this.one=one;
     }
    public void method3()
    {
        //print something
    }
}

现在,我想在第二类中模拟 method3() 而我测试第一类的 method1() 并且我的 Junit 是这样的。

private One one;
private Two two;
@Before
public void setup()
{
    one = Mockito.spy(new One());
    two = Mockito.spy(new Two(one));
}
    

@Test
pubic void testMethod1InClassOne()
{
    Mockito.doNothing().when(testTwo).method3();
    testOne.method1();
}

但不知何故,method3() 并没有被嘲笑,我仍然看到它的打印内容。但是,我可以成功地模拟 method2()。可能是因为 method2() 是直接从我正在测试的方法 method1() 调用的?请建议我如何模拟方法3。

谢谢, 梅赫

标签: javaunit-testingjunitmockingmockito

解决方案


TL;DRtestOne通过注入使其可测试testTwo

twoobject 似乎是One类实例的实例成员。因此,它需要被嘲笑(或者它的行为被存根)来实现你的目标。在testMethod1InClassOne测试方法中,您没有将模拟testTwo对象注入到testOne对象中,因此即使 Mockito 也接受下一行的存根,它不会用实际调用替换它,因为它们发生在不同的实例上。更重要的是,似乎类的对象One是不可测试的,我建议你在类定义中添加以下构造函数:

One(Two two) {
   this.two = two;
}

然后您的测试可能如下所示:

@Test
pubic void testMethod1InClassOne()
{
    Two testTwo = Mockito.mock(Two.class);
    One testOne = new One(testTwo);
    Mockito.doNothing().when(testTwo).method3();
    testOne.method1();
}

推荐阅读