委托任务的类如何进行单元测试最佳?

8

我有一个问题,关于如何最好地处理顶层类的JUnit测试。想象一下,我有一个名为SomeWriter的类,它具有重新格式化字符串并将其写入流的方法。该方法实际上不执行工作,而是将其委派给实际执行真正工作的成员对象。我在下面的类中概括了这一点。

public class SomeWriter {
public void writeReformattedDataToStream(OutputStream outStream, String message) {
        myReformatter.DoTheActualWorkAndWriteDataToStream(outStream, message);
}
}

在这个假设的例子中,我已经为myReformatter类编写了单元测试,并证明了myReformatter的工作。我的问题是,我应该如何处理SomeWriter中writeReformattedDataToStream的单元测试?
如果我进行黑盒测试,我需要编写与我应用于myReformatter类相同的测试,因为我不知道它如何实现任务。然而,单元测试实际上是白盒测试,所以仅确保正确调用myReformatter的测试是否有效?
归根结底,我的writeReformattedDataToStream测试应该有效地重复对myReformatter的测试,还是模拟myReformatter并仅检查其是否被正确调用?
我很感激这与JUnit Test - Class invokes methods in other class类似。
3个回答

6

这种即时委托通常被归类为“太简单,不需要测试”,但如果您有绝对的要求,那么您需要模拟您的OutputStream(使用EasyMock或类似工具)和myReformatter,并验证委托是否调用了适当的方法。


他为什么要模拟OutputStream? - Francois Bourgeois
1
如果他要测试这个方法,他必须确保它将 outStream 传递给委托,并且不会用其他的 OutputStream 替换它;传入一个模拟对象是我知道确认 write 被调用在同一个对象上最简单的方法。 - chrylis -cautiouslyoptimistic-
1
谢谢。有趣的是,似乎有一种感觉认为测试过于简单。我一直在尝试采用TDD方法进行设计,这就是为什么我最终会为通常不会费心去测试的方法编写大量测试的原因。现在我有一种可怕的感觉,有人会告诉我,如果我先写了测试,我就不会知道实现方式。 - user1973769

4
如chrylis所说,您不应该测试这种方法。
实际上,没有什么需要测试的。
如果您编写一个测试用例来测试委托/服务是否被调用,则您的测试将绑定到被测试方法的实现。
因此,任何更改被测试方法的实现都需要更改测试;我相信您不想要这样。

3
尝试注入。为了测试目的,您可以注入自己的myReformater类实现,该实现仅检查方法是否被正确调用并返回。然后,您可以独立测试您的测试类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接