1

我有一个我想测试的 MyClass。

我有一个要用于此的 TestMyClass 类。

在 MyClass 我有几个私有变量。

我想在 TestMyClass 中使用这些私有变量运行测试。

我可以将所有这些私有变量更改为公共变量,然后将它们用作 TestMyClass 中的对象,但是有没有办法在不增加这些变量的可见性的情况下进行测试?无需手动进入 TestMyClass,删除私有可见性标记并进入“公共”可见性市场。

谢谢!

4

6 回答 6

4

不建议直接测试私人成员。代码的设计方式应使这些私有成员将被公共(接口)方法间接调用(在您的情况下例如:您可以为成员变量设置 setter 和 getter)。

但是,如果您绝对想测试私有成员,则可以使用Java 反射 API 。

于 2013-03-05T09:14:39.500 回答
2

为什么不提供 setter / getter 并使用它们而不是暴露变量?

于 2013-03-05T09:15:41.530 回答
2

setter and getters对类中的私有属性使用 public

于 2013-03-05T09:16:02.527 回答
2

正如其他答案中所解释的,没有必要/不建议测试私有方法和/或访问私有字段。如果您真的想要/必须这样做,那么PowerMock就是您要走的路。

如果您必须访问私有属性来设置它们,那么Spring 的 ReflectionUtils会很有帮助。如果您使用的是 mockito,您还可以使用@InjectMocks注释,它将@Mock在测试对象的测试类中注入任何 -annotated 属性。

否则,仍然有可能更改public对 aprotectedpackage privateaccess 的访问,这将比public.

于 2013-03-05T09:29:39.870 回答
1

使用 getter/setter 与私有变量交互有什么问题?您可以在测试类中使用setUp()/@Before方法来设置您希望测试的状态。例如:

public class MyClass {
    private int myInt;
    public void setMyInt( int i ) { this.myInt = i; }
    public int getMyInt() { return this.myInt; }

    public void addsTo( int add ) { return myInt + add; }
    ...
}


public class TestMyClass {
    MyClass my = new MyClass();
    @Before public void setup() { my.setMyInt( 42 ); }
    @Test public void testIs42() { assertEqual( "MyInt is 42" , my.getMyInt() , 42 ); }
    @Test public void testAddsTo() { assertEqual( "addsTo() works" , my.addsTo( 10 ) , 52 ); }
}

说得通?以这种方式,您只能通过公共方法与私有变量进行交互。该addsTo()示例旨在说明您通常会测试类公开的公共方法,而不是 getter/setter。

同样,我经常发现自己将方法可见性从私有更改为受保护,以允许测试类方法。

干杯,

于 2013-03-05T09:16:40.887 回答
1

一种解决方案是将它们标记为受保护,然后使用 MyClassTestSupport 使用 getter/setter 公开它们。但是,如果您的类是其他人的基类,则此模式效果不佳...

于 2013-03-05T09:17:19.470 回答