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

模拟从多个方法调用的方法

齐俊达
2023-03-14
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
    }
}
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。

谢谢,梅赫

共有1个答案

南门展
2023-03-14

TL;DR通过向TestTwo中注入TestTwo使Testone可测试。

Two对象似乎是One类实例的实例成员。因此,它需要被嘲笑(或者是被打断的行为)来实现你的目标。在TestMethod1Inclassone测试方法中,您没有将MockTestTwo对象注入到Testone对象中,因此即使Mockito接受下面一行的stubbing,它也不会用实际调用替换它,因为这些调用发生在不同的实例上。此外,似乎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();
}
 类似资料:
  • 我试图在测试中模拟一个调用,但我得到了一个错误,因为它调用了真正的方法,而不是模拟它。 这是我的方法 } 这是我的测试课 测试实际上调用了受保护的方法config Setter,并在设置代理时失败。帮助我理解我在这里做错了什么。

  • 我目前正在为一个groovy应用程序编写单元testcase 有人能告诉我这是不是嘲弄斯波克的两个电话的正确方法?如果没有,那么请引导我走向正确的解决方案。

  • 我正在学习使用Spock进行单元测试,遇到了一个我似乎无法理解的问题: 注意:这个例子非常简化,但它得到了我想要实现的概念。 在正常操作中,调用会阻塞,直到建立到的连接。 我希望能够测试返回的上的交互。我可以通过以下方式与Spock一起做到这一点: 乍一看,这工作得很好,只是对的每次调用都将返回经过嘲弄的。由于此调用(有意地)被调用的次数不确定(因为我想接受不确定数量的入站连接),所以mock上的

  • 我试图为一个类编写一个单元测试,这个类使用带有库中的的Google vision API。问题是,由于某种原因,我的模拟仍然调用真正的方法,然后抛出一个NPE,这破坏了我的测试。我以前从未在模拟上见过这种行为,我想知道我是不是做错了什么,是不是Spock/Groovy中有bug,还是与Google lib有关?

  • 下面是我要为其创建测试的类和方法: 具体地说,我希望模拟getAnalytics.getAll(),这样它就会返回一个我已经定义的字符串。而不是方法执行它的任务。这是我的代码: