This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center。
已关闭8年。
假设一个类
出于示例的考虑,将
假定一个单元测试
我试图收集最佳策略的一些事实,以便在测试中设置这些容器控制的依赖项:
(1)将
(-)不必要的肿代码(?)
(+)简单
(+)适用于所有(test-)类
(2)使用反射设置
(-)复杂,难以阅读和维护
(+)适用于所有(test-)类
(3)删除
(+)最简单,最短的解决方案
(-)在生产代码方面不是最小的范围
(-)在包装外无法使用
关于这个主题有什么明确的建议吗?
更新:我知道我可以将容器用作测试的依赖提供程序-我这样做是为了进行集成测试,但是我当然不希望单元测试中有完整的Java EE堆栈。
我希望这不会导致对框架的激烈争论;-)
Update2:谢谢大家到目前为止的回答,但是我似乎表示不清楚。答案往往表明我没有充分利用底层DI框架的可能性,或者只是需要更多的嘲弄。当然,这一切都是正确的,但是我宁愿收集意见,是否可以将类成员的可见性扩展到默认级别,以利用可测试性,或者“专用于测试”的“ getter-setter”方法更好,或者反思(我当前的解决方案)是要走的路。试图编辑问题,以便更好地描述我的问题。
恢复并结束如果我拥有适当的权利,我非常想结束这个问题,因为我显然以一种非常误导且令人困惑的方式表达了自己。我既不想在测试中进行有关正确的依赖注入的讨论,也不需要任何代码片段。我的经历(光荣地失败了)是要就我在Update 2中已经写过的内容展开讨论。感谢大家的贡献-我当然会在以后的问题上投入更多的精力。
已关闭8年。
假设一个类
Foo
,其依赖项Bar
由某些DI框架(在这种情况下为CDI)注入:public class Foo {
@Inject
private Bar bar;
...
public void someLogic() {
...
}
}
出于示例的考虑,将
Bar
设为可模拟的基础结构依赖性,例如EntityManager
或UserTransaction
,这超出了单元测试的范围,但是-再次出于示例的原因-必须正确地初始化Foo。假定一个单元测试
FooTest
(我明确地想编写没有容器依赖项的单元测试),它需要以某种方式设置或模拟依赖项,但是否则尝试在所需的容器功能方面保持低调(因此不是集成测试) )。public class FooTest {
private Foo foo;
@BeforeClass
public void initFoo() {
... set bar somehow ...
}
@Test
public doSomeTestOnSomeMethod() {
...
}
}
我试图收集最佳策略的一些事实,以便在测试中设置这些容器控制的依赖项:
(1)将
getBar()
和setBar()
添加到Foo
(-)不必要的肿代码(?)
(+)简单
(+)适用于所有(test-)类
(2)使用反射设置
bar
(-)复杂,难以阅读和维护
(+)适用于所有(test-)类
(3)删除
private
限定词以使这些字段可从测试内访问(假设使用相同的程序包)(+)最简单,最短的解决方案
(-)在生产代码方面不是最小的范围
(-)在包装外无法使用
关于这个主题有什么明确的建议吗?
更新:我知道我可以将容器用作测试的依赖提供程序-我这样做是为了进行集成测试,但是我当然不希望单元测试中有完整的Java EE堆栈。
我希望这不会导致对框架的激烈争论;-)
Update2:谢谢大家到目前为止的回答,但是我似乎表示不清楚。答案往往表明我没有充分利用底层DI框架的可能性,或者只是需要更多的嘲弄。当然,这一切都是正确的,但是我宁愿收集意见,是否可以将类成员的可见性扩展到默认级别,以利用可测试性,或者“专用于测试”的“ getter-setter”方法更好,或者反思(我当前的解决方案)是要走的路。试图编辑问题,以便更好地描述我的问题。
恢复并结束如果我拥有适当的权利,我非常想结束这个问题,因为我显然以一种非常误导且令人困惑的方式表达了自己。我既不想在测试中进行有关正确的依赖注入的讨论,也不需要任何代码片段。我的经历(光荣地失败了)是要就我在Update 2中已经写过的内容展开讨论。感谢大家的贡献-我当然会在以后的问题上投入更多的精力。
最佳答案
向要测试的类中添加一个setter,然后在单元测试中,注入Bar
类的a mock version。 Mockito,EasyMock,JMock都使死亡变得简单。
在Foo
类上没有setter的情况下,任何人无论如何都无法在您的容器之外使用它?将二传手标记为“膨胀”听起来对我来说太夸张了。我相信您是在考虑这种情况。
您的更新的更新:
当然,这一切都是正确的,但是我想收集关于是否可以将类成员的可见性扩展到默认级别以便利用可测试性,getter-setter方法是否更好,或者是否可以反思的意见(我当前的解决方案) )是要走的路。
我个人的观点是,添加设置器只是一些额外的击键(大多数IDE会自动为您进行击键),而更改字段的可见性可能会导致其他错误的选择(突然有人决定他们可以编写可用于生产代码的代码)由于没有将其设置为private
,因此也直接使用该字段,并且与仅使用setter相比,使用反射需要更多的代码(并且速度较慢)。 setBar(Bar)
方法非常简单。
关于java - 在单元测试中设置依赖项的最佳策略? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6733585/