我有一个我想测试的 MyClass。
我有一个要用于此的 TestMyClass 类。
在 MyClass 我有几个私有变量。
我想在 TestMyClass 中使用这些私有变量运行测试。
我可以将所有这些私有变量更改为公共变量,然后将它们用作 TestMyClass 中的对象,但是有没有办法在不增加这些变量的可见性的情况下进行测试?无需手动进入 TestMyClass,删除私有可见性标记并进入“公共”可见性市场。
谢谢!
我有一个我想测试的 MyClass。
我有一个要用于此的 TestMyClass 类。
在 MyClass 我有几个私有变量。
我想在 TestMyClass 中使用这些私有变量运行测试。
我可以将所有这些私有变量更改为公共变量,然后将它们用作 TestMyClass 中的对象,但是有没有办法在不增加这些变量的可见性的情况下进行测试?无需手动进入 TestMyClass,删除私有可见性标记并进入“公共”可见性市场。
谢谢!
不建议直接测试私人成员。代码的设计方式应使这些私有成员将被公共(接口)方法间接调用(在您的情况下例如:您可以为成员变量设置 setter 和 getter)。
但是,如果您绝对想测试私有成员,则可以使用Java 反射 API 。
为什么不提供 setter / getter 并使用它们而不是暴露变量?
setter and getters
对类中的私有属性使用 public
正如其他答案中所解释的,没有必要/不建议测试私有方法和/或访问私有字段。如果您真的想要/必须这样做,那么PowerMock就是您要走的路。
如果您必须访问私有属性来设置它们,那么Spring 的 ReflectionUtils会很有帮助。如果您使用的是 mockito,您还可以使用@InjectMocks注释,它将@Mock
在测试对象的测试类中注入任何 -annotated 属性。
否则,仍然有可能更改public
对 aprotected
或package private
access 的访问,这将比public
.
使用 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。
同样,我经常发现自己将方法可见性从私有更改为受保护,以允许测试类方法。
干杯,
一种解决方案是将它们标记为受保护,然后使用 MyClassTestSupport 使用 getter/setter 公开它们。但是,如果您的类是其他人的基类,则此模式效果不佳...