我是新手进行单元测试,并在这里使用简单的用例。 我将setter声明为私有(不希望任何人设置除Spring之外的那些变量)
private setX(T x) {
this.x = x;
}
在编写单元测试时,当我想为这些变量设置值时,我不能。一个快速的解决方法是让公共制定者,但这看起来不太好。我使用Mockito作为模拟框架和Junit进行单元测试。
所有帮助表示赞赏。
编辑:
Class A {
private Clazz clazz;
//to be used only by spring
private setClazz(Clazz clazz) {
this.clazz = clazz;
}
答案 0 :(得分:2)
使它们受保护或包私有,并将测试放在与该类相同的包中 正在测试中。
或者使用反射来调用setter,就像Spring一样。
或者使用Mockito的InjectMocks
注释,它会通过使用反射为你调用setter来注入模拟依赖。
答案 1 :(得分:0)
不要直接对私人会员进行单元测试。
(整个互联网都有很多争论。)
单元测试不必测试代码中的属性和方法,它们会测试代码的功能。具体而言,对象公开的外向业务功能。因此,当您面对需要测试的私有成员时,有两件事情是真的:
面向对象设计的原则适用于单元测试,就像它们对任何其他代码一样。封装仍然是封装。如果该单元强制中断该封装,那么它们很快会与被测试的代码紧密耦合,这会使它们变得更加脆弱。
考虑"重构" red/green/refactor周期的一步。如果测试紧密耦合到被测组件的私有内部,那么重构该组件将需要更改测试。不只是重构这些测试,而是更改他们正在测试的逻辑。这打破了TDD周期。
将其扩展为更大的代码系统,并且测试成为 hindrance 以重构该代码,当它们应该是资产来重构该代码时。如果测试仅验证产生的向外功能,则可以轻松地重构代码的内部,并使用测试来验证重构工作。