在测试期间伪造void方法调用的响应



我正在测试一个类TestObject。在这个类中,有一个void返回函数stageOne(String),我想测试它。在stageOne的末尾,有一个对另一个void返回函数stageTwo(String)的调用。我想伪造stageTwo的响应,这样stageTwo就永远不会被实际调用。为了通过测试,TestObject需要准确地调用stageTwo一次。

我使用when...thenReturn尝试了很多方法,但都无法正常工作。以下是我目前的最佳猜测。

class TestClass {
    private TestObject testObject;
    @Before
    public static void setUp() {
        testObject = new TestObject();
    }
    @Test
    public void test1() {
        when(testObject.stageTwo(any(String.class))).thenReturn(Void);
        testObject.stageOne("Test data");
        verify(testObject, times(1)).stageTwo(any(String.class));
    }    
}

我正在使用IntelliJ,并且能够进行其他测试,但我根本无法使when...then构造工作。在上面的例子中,IntelliJ建议我把它变成一个局部变量OngoingStubbing<Void> voidOngoingStubbing,然后它说这也是错误的。

我也试过

doNothing().when(testObject.stageTwo(any(String.class)));

但这也不起作用。intelliJ使用与以前相同的消息在when()的内容下加下划线。

编辑:下面的测试对象结构:

public class TestObject {
  public void stageOne(String str) {
    String str2 = ...
    // do stuff
    stageTwo(str2) // don't proceed with this method, but verify that it was called
  }
  public void stageTwo(String str) {
    // do stuff which I don't want to do in this test
    // e.g. calls to external services and other complexities
  }
}

您可以使用部分mock,就像这里的例子一样。不过,请确保首先将对象创建为mock。

TestObject testObject = mock(TestObject.class);
doNothing().when(testObject.stageTwo(anyString()));
when(testObject.stageOne(anyString())).thenCallRealMethod();

如果把代码分成两个方法是值得的,那么最好考虑重构代码。例如,如果代码调用对象并只运行第一个方法是合理的,那么从第一个方法中删除对stageTwo的调用,并强制调用代码同时调用stageOnestageTwo。或者,让stageOne返回它的字符串,并编写第三个方法来调用所有阶段:

public void allStages(String str) {
    String str2 = stageOne(str);
    stageTwo(str2);
}

这很好地分解了您的方法,并允许您单独测试它们。目前的设置方式是,这两种方法之间有太多的耦合,所以如果你真的想让它们分开,你应该考虑这样的事情。

相关内容

  • 没有找到相关文章

最新更新