gpt4 book ai didi

java - spy 和直接对象的区别

转载 作者:行者123 更新时间:2023-11-28 21:30:48 26 4
gpt4 key购买 nike

就我收集的有关 Mockito 的知识而言,当我们侦测一个对象并对其调用任何方法时,它的真正实现就会被执行。

class Abc {
public int fun() {
//to do stuff
return 5;
}
}

使用 spy 进行测试:

Class AbcTest {
public void testFun()
{
Abc ob= spy(Abc.class);
ob.fun(); //calls real implementation
//Other stuff
}
}

没有 spy 的测试:

Class AbcTest
{
public void testFun() {
Abc ob=new Abc();
ob.fun();
//other stuff
}
}

使用上述两种方法调用方法的实际实现有什么区别?

最佳答案

使用 spy 应该会在被测系统中产生相同的行为,但如果您愿意,还可以覆盖和验证方法行为。

class AbcTest {
public void testFun()
{
Abc ob= spy(Abc.class);
ob.fun(); //calls real implementation
//Other stuff
}
}

这(从您的问题中引用)不会这样编译;你需要 spy(new Abc()) 而不是 spy(Abc.class)。这是一个微妙的点,但实际上它对于了解正在发生的事情非常重要。


考虑一下:

Abc nonSpy = new Abc();
Abc isASpy = Mockito.spy(nonSpy);

此时,isASpynonSpy 不是同一个对象;它是一个记录交互并转发到 a copy of the original object nonSpy 的对象— 除非您已使用 doReturndoThrow(等)对它进行 stub ,此时它会跳过对原始方法的调用并改为执行 stub 操作。

您可以想象 Mockito 已经为您编写了以下实现:

class AbcSpy extends Abc {             // simplified analogy of Mockito proxy
@Override public void fun() {
recordCallToFun(); // record for verification later
if (hasStubbedBehaviorForFun) {
performStubbedBehaviorForFun(); // perform doReturn/doThrow/etc
return;
}
copyOfOriginalObject.fun(); // call real method
}
}

通过将 isASpy 传递给您的被测系统(与 nonSpy 相对),您可以为您的被测系统提供一个真实的交互对象,并提供一个 < em>很少 行为覆盖。当然,您也可以简单地使用 spy 来验证被测系统是否与协作者 Abc 正确交互。

关于java - spy 和直接对象的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23140315/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com