单元测试私有setter的类方法

时间:2014-10-15 16:33:29

标签: junit mockito

我是新手进行单元测试,并在这里使用简单的用例。 我将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;
    }

2 个答案:

答案 0 :(得分:2)

使它们受保护或包私有,并将测试放在与该类相同的包中 正在测试中。

或者使用反射来调用setter,就像Spring一样。

或者使用Mockito的InjectMocks注释,它会通过使用反射为你调用setter来注入模拟依赖。

答案 1 :(得分:0)

不要直接对私人会员进行单元测试。

(整个互联网都有很多争论。)

单元测试不必测试代码中的属性方法,它们会测试代码的功能。具体而言,对象公开的外向业务功能。因此,当您面对需要测试的私有成员时,有两件事情是真的:

  1. 业务功能可以根据状态调用该私有功能。因此,如果当前单元测试没有将该功能作为代码覆盖的一部分调用,则那些测试并非详尽无遗,并且存在未经测试的状态。创建一个测试,在调用面向公众的功能之前安排该状态,以间接测试该私有成员。
  2. 测试是详尽无遗的,并且业务功能实际上并未在任何已知条件下调用该私有成员。在这种情况下,可以简单地从代码中删除私有成员。
  3. 面向对象设计的原则适用于单元测试,就像它们对任何其他代码一样。封装仍然是封装。如果该单元强制中断该封装,那么它们很快会与被测试的代码紧密耦合,这会使它们变得更加脆弱。

    考虑"重构" red/green/refactor周期的一步。如果测试紧密耦合到被测组件的私有内部,那么重构该组件将需要更改测试。不只是重构这些测试,而是更改他们正在测试的逻辑。这打破了TDD周期。

    将其扩展为更大的代码系统,并且测试成为 hindrance 以重构该代码,当它们应该是资产来重构该代码时。如果测试仅验证产生的向外功能,则可以轻松地重构代码的内部,并使用测试来验证重构工作。