java - 模拟从多个方法调用的方法
问题描述
所以我的代码看起来像这样
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。
谢谢, 梅赫
解决方案
TL;DRtestOne
通过注入使其可测试testTwo
。
two
object 似乎是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();
}
推荐阅读
- spring - 在 Spring 中添加了所有依赖项,并且 spring 配置也完成了,然后在运行时它给出了 filenotfoundexception
- php - 如何多次绑定参数两次
- guice - 使用 guice 在运行时按名称获取实例
- python - 在熊猫数据框中添加一列的总数
- c - [使用下一个和随机指针克隆链表][运行时错误]
- python - 在熊猫python中添加列
- elasticsearch - 将数学添加到 kibana 中的指标
- java - 将默认的 Java 咖啡码头图标更改为其他图标
- javascript - 创建动画以使对象沿 svg.js 中的连续路径以不同的速度移动
- ruby-on-rails - 将项目克隆到 Windows 机器后,Selenium 找不到 chromedriver