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

mockito:试图窥探method是在调用原始方法

邵飞鸿
2023-03-14

我使用的是Mockito1.9.0。我想在JUnit测试中模拟类的单个方法的行为,因此

final MyClass myClassSpy = Mockito.spy(myInstance);
Mockito.when(myClassSpy.method1()).thenReturn(myResults);

问题是,在第二行中,MyClassSpy.Method1()实际上是被调用的,导致了一个异常。我使用模拟的唯一原因是,以后每当调用MyClassSpy.Method1()时,将不会调用真正的方法,而返回MyResults对象。

MyClass是接口,MyInstance接口的实现(如果这很重要的话)。

我需要做些什么来纠正这种间谍行为?

共有3个答案

龙高歌
2023-03-14

我的情况与公认的答案不同。我试图模拟一个不在包中的实例的包私有方法

package common;

public class Animal {
  void packageProtected();
}

package instances;

class Dog extends Animal { }

还有测试类

package common;

public abstract class AnimalTest<T extends Animal> {
  @Before
  setup(){
    doNothing().when(getInstance()).packageProtected();
  }

  abstract T getInstance();
}

package instances;

class DogTest extends AnimalTest<Dog> {
  Dog getInstance(){
    return spy(new Dog());
  }

  @Test
  public void myTest(){}
}

编译是正确的,但是当它尝试设置测试时,它调用的是real方法。

声明方法为protected或public可以解决问题,因为这不是一个干净的解决方案。

文建业
2023-03-14

在我的例子中,使用Mockito2.0,我必须将所有any()参数更改为nullable(),以便存根真正的调用。

邹弘
2023-03-14

让我引用正式文件:

有时用when(对象)来阻止间谍是不可能的。示例:

List list = new LinkedList();
List spy = spy(list);

// Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty)
when(spy.get(0)).thenReturn("foo");

// You have to use doReturn() for stubbing
doReturn("foo").when(spy).get(0);

在您的例子中,它类似于:

doReturn(resultsIWant).when(myClassSpy).method1();
 类似资料:
  • 请有人帮助我在上面,也提供我的解决上述问题。

  • 我正在与Javascript、Mocha、Chai和SinonJ合作。我想做的是监视一个“equals”方法,该方法由另一个方法“compareUsingOperator”动态调用。下面的代码显示了我的类“StringComparator”,它有两个方法“equals”和“compareUsingOperator”。 这是我的单元测试: 在我的单元测试中,我在“equals”方法上设置了一个间谍,

  • 我要用模拟的approveActivity方法在间谍一个spring豆。 但这不是工作。 > spring自动写入对象成功。 间谍对象是成功的。 模拟方法引发异常。 在此输入代码 我不知道为什么,请帮帮我! SpringFramework3.x和Mockito2.x以及JUnit4.x。 ActivityReduceAPImpl.java org.mockito.exceptions.misusi

  • 我正在用Mockito为一个项目设置jUnit测试。在被测系统(DrawingService)中调用方法时遇到问题。模拟包括图形和IDrawingRepository。 我不熟悉TDD、单元测试和一般的模拟,所以我可能犯了一些noob错误?任何帮助都将不胜感激。 以下是测试课程: 以下是正在测试的系统:

  • 我有一个类,它有两个方法。我想模拟这个类,然后模拟第一个方法,但不是第二个。 例如。 单元测试代码: 奇怪的是m2没有被调用。 我错过什么了吗?

  • Powermock为什么不模拟静态方法调用,而是在然后()语句中调用初始方法? 在这种情况下,我有一系列方法调用: TestClass方法-调用- Class4方法尝试查找上下文中不存在且挂起的对象,因此我尝试使用Powermock模拟公共静态Class3方法。 所有的类和方法都是非最终的。我使用TestNg。我的测试方法有一个@准备测试我尝试了以下方法来模拟方法调用: 或而不是当-然后返回: 或