【问题标题】:Mock a method which is called from multiple methods模拟从多个方法调用的方法
【发布时间】:2021-08-30 14:16:00
【问题描述】:

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

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。

谢谢, 梅赫

【问题讨论】:

    标签: java unit-testing junit mocking mockito


    【解决方案1】:

    TL;DR 通过在其中注入 testTwo 使 testOne 可测试。

    two 对象似乎是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();
    }
    

    【讨论】:

    • +1。我有一个community wiki answer of other strategies as well,但你描述的重构可能是最强大和最合适的。
    • 您好,感谢您的回答。但是在我的代码中,类二有一个参数化的构造函数,其中类一对象作为参数,我也在二构造函数中注入了模拟的一对象。它仍然不起作用。现在已经正确更新了我的问题。请建议现在该做什么以及我在哪里做错了。
    猜你喜欢
    • 1970-01-01
    • 2022-10-24
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多