如何对回调逻辑进行单元测试?

2022-09-04 21:46:13

更完整的问题是,给定一个期望回调作为参数的依赖项,我如何编写一个涵盖回调逻辑的单元测试,并且仍然设法模拟依赖项?

public class DoStuff {
    public void runThis(Runnable callback) {
        // call callback
    }
}

public class ClassUnderTest {
    private DoStuff stuffToDo;

    public void methodUnderTest() {
        this.stuffToDo.runThis(/*a runnable with some logic*/)
    }
}

在上面的示例中,我将模拟,因为我应该验证方法调用的调用和模拟输出。但是,模拟会导致回调逻辑不被测试。此外,回调逻辑似乎应该是私有的,所以我不希望直接测试它;也许这是我的误解。stuffToDorunThis

由于回调的使用相当广泛,我希望有一种通用的方法来测试它们,但我还没有找到它。


答案 1

您不能在单个测试中。如果你模拟了一些东西,它就被模拟了,这意味着它只能验证参数和模拟返回值(你在测试中配置)。

事实上,嘲笑某物的全部意义在于单独测试使用模拟的内容。如果你想要一个单元测试,你不想担心使用一些可能有效或可能不起作用的回调实现。您模拟回调,因此不必担心它。DoStuff

通过单独测试回调代码,隔离测试回调用户(对回调使用模拟),或者通过抛出集成测试来进行良好的测试,从而将完全配置的组件作为一个整体使用,您仍然可以进行良好的测试。


答案 2

在这里,基本上你想测试类DoStuff。这意味着你需要取消测试DoStuff中的所有方法,对吧?因此,在这种情况下,您需要做的是,不要嘲笑toDo本身,而是将模拟的Runnable注入到toDo中。然后检查您的可运行是否成功执行。

但是,如果您在类中确实有其他功能,则可以进行单独的测试并模拟它们。


推荐