为什么"新"构造函数/字段中的关键字对于单元测试是不灵活的?

时间:2017-02-10 07:14:50

标签: java unit-testing

我一直在遵循Guice的一些指导原则,它提到你不应该在构造函数或字段中使用new,因为它不灵活的设计阻止了正确的单元测试。

这是什么意思?

还有一个问题,如果我的函数读取XML文件并解析它,那么尝试捕获所有可能的错误输入值是单元测试的范围吗?在UI中,我们不会为输入验证编写单元测试。

1 个答案:

答案 0 :(得分:6)

从不是苛刻的,经常可能是更合适的陈述。

关键是:为了进行正确的单元测试,您有时必须控制您所测试的"类的对象"正在使用。当通过调用new()来初始化相应的字段时,您就无法控制该字段。 (好吧,你可以使用字节码操作工具,比如 PowerMock ;但特别是在编写自己的代码时:那你绝对避免使用PowerMock;需要使用它表示你放下一个糟糕的设计。期间)

然而,当您使用依赖注入时,单元测试可以将该字段的模拟对象传递到被测试的类中。

但请注意:这不仅仅是关于"正确的单元测试"。 A)初始化您的业务逻辑和B)您的业务逻辑正在进行其业务"之间存在本质区别。这些是两个不同的职责,当您对这种分离清楚时,您的产品随着时间的推移难以维护和增强。

了解这一主题的一个很好的起点是videos。每个人真的值得每一分钟......

编辑:您的评论/问题相当远;并且有大量现有材料(例如hereherethere)。但是这里有一个一般性的评论:合理的单元测试的本质是......将你的业务逻辑分成小的,可测试的单元!

我的意思是:当你将大量代码推入一个可以完成5个不同事物的类时,那么编写好的单元测试就是 hard 。相反:您为一项责任创建一个单位。在您的上下文中:读取 XML数据可能有一个类。该类处理XML,并返回不再是XML的东西。然后你有另一个类,它适用于第一个类创建的输出。

关于你的第二个问题:这真的取决于你的XML来自哪里。换句话说:您的生产代码必须能够检测所有类型的错误XML输入。因为您希望生产代码正确处理可以提供给它的所有输入。因此,您的单元测试的目标是确保您实施的所有验证实际上正在运行。验证XML的测试代码的工作!单元测试验证您的代码是否符合合同!

现在,您的单元测试重点关注:一些测试确保此XML读取/转换有效;和其他测试(对XML一无所知)确保进一步处理有效。

但正如所说;这真的是一个非常广泛的主题,你不应该期望单个SO答案可以告诉你需要做的所有事情。这个主题需要花费数月时间研究各种资源,并且......练习,练习,练习......