是否几乎可以在不使用java中的任何DI框架的情况下做好TDD(或BDD)?

eke*_*ren 2 java tdd bdd unit-testing dependency-injection

IMO良好TDD的主要特征之一是:单独测试您的类(或实际单元).

当您这样做时,您可以在每个测试中实际测试单个行为 - 对于您遇到的单个问题,只会有一个测试.

为此,首先必须验证您的类中没有静态引用(包括构造函数AKA new关键字).

理论上,很容易不使用任何依赖注入框架并在完全隔离中测试您的类,为此您需要在构造函数中注入所有依赖项并创建将调用该new关键字的Factories类.

我发现这个理论MO在实践中实际上太难了.

我错过了这个过程中的重要内容吗?

编辑:我认为我们都应该针对一次代码更改失败.它永远不会是完美的,但它会使你的代码更接近那里,人们忘记了测试代码也是可维护的代码,测试代码的规范变化.

如果你没有瞄准那里,你将最终删除测试,这是一个糟糕的解决方案

Pét*_*rök 10

我不认为你需要DI框架进行单元测试 - 在DI成为一种时尚之前,TDD已经存在了很多年.如果代码本身不使用显式DI框架,为什么要将它用于单元测试呢?

当然,DI框架可以在一定程度上简化任务.OTOH他们通过将复杂性放在其他地方来实现.我的偏好是进行自包含的单元测试,到目前为止,我几乎总是在没有DI框架的情况下进行管理.这通常需要重构我的测试代码,有时甚至需要复制代码,但我可以忍受.而且,正如@kostja所说,模拟框架也是一个很大的帮助.

设计可测试性也很重要 - 如果一个类本身很难测试,那么最好重构它而不是试图通过DI框架来减轻痛苦.

请注意,所有这些都需要大量的练习,以及思维方式和思维方式的改变.所有这些都需要时间和耐心......你跟上的越多,你就越好:-)

您可以在每个测试中实际测试单个行为 - 对于您遇到的单个问题,只能进行一次测试.

我认为你的结论在这里是错误的.即使您在每个测试中测试一件事,您也可以通过单个代码更改来打破大量测试.更新:每个测试都是验证测试代码中的单个执行路径.但是,这些执行路径很少是独立的 - 除了最简单的方法之外,所有路径都是常见的路径部分.任何改变都可以打破多个测试.