首页 > 解决方案 > 有没有办法让对象的私有方法在调用时什么也不做?

问题描述

我正在使用 JUnit、Mockito 和 ReflectionTestUtils 在 Java 中编写集成测试。我有以下情况:

我要测试的源代码:

class AClassINeed extends SomeClass{


  public method_I_need_to_call(){

    //some code
    method_that_fails();
    // lots of other calls

  }

  private boolean method_that_fails(){
    // Instantiate a new local object of external dependency
    // Call a method from this new object ==> AKA FAILURE
  }
}

在我的测试方法中: 我需要在这里创建一个 realObject 以便所有真实的代码都得到练习。除了会失败的方法。我目前正在尝试这样:

AClassINeed realObject = new AClassINeed(Lots.class, Of.class, Parameters.class);
AClassINeed spyObject = Mockito.spy(realObject);
Method spyObjectPrivateMethod = spyObject.getClass().getDeclaredMethod("method_that_fails");
spyObjectPrivateMethod.setAccessible(true);
when(spyObjectPrivateMethod).thenReturn(true); // <== Syntax error "Cannot resolve method thenReturn(boolean)"

我怎样才能做到这一点?我无法创建 AClassINeed 的模拟对象,因为我想正常执行所有方法,但失败的方法除外。

我也尝试过这样的 ReflectionTestUtils:

Method failingMethod = realObject.getClass().getDeclaredMethod("method_that_fails", String.class, String.class);
failingMethod.setAccessible(true);
ReflectionTestUtils.setField(realObject, "method_that_fails", failingMethod); // <== Wrong! This cannot be done for methods

在这一点上,我难住了。

有没有办法让我在不嘲笑整个班级的情况下让那个失败的方法什么都不做?

标签: javareflectionmockitointegration-testing

解决方案


推荐阅读