2016-08-23 65 views
4

最近,我开始对TDD工作exisitng项目面临几个问题,其中之一是下面嘲讽/磕碰类的私有变量,而getter和setter方法

我有一个私有变量在被嘲笑提及测试类和可变看起来像下面

private Class<XYZ> cls = XYZ.class; 

后面这种“CLS”变量被用作arugment对于该方法中的一个作为的className

private List create(Class className, Object objectTO, List<String> names) 

我知道私有变量可以被嘲笑和 我嘲笑了私有变量在我的测试情况下,通过下面的下面的步骤

  1. 宣布为java.lang.reflect.Field;
  2. Field field = PowerMockito.field(XYZ.class,"cls");
  3. field.set(XYZ.class, "objectOfXYZClass");

运行我的测试类,我得到低于错误

java.lang.IllegalArgumentException: Can not set java.lang.Class field com.tools.XYZ.cls to java.lang.Class 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164) 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) 
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55) 
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:75) 
at java.lang.reflect.Field.set(Field.java:680) 

请有人可以帮我解决这个问题,让我知道我错过了什么。

PS:我用@preparefortest并提到所有在所需的类和使用@runwith(powermockrunner.class)

回答

1
field.set(instanceOfClassXYZ, "") 

放在一组,类的实例上运行我的测试类。不上课。因为你将字符串“objectOfXYZClass”设置为一个对象。没有到类级;) ,我会添加

field.setAccessible(true); 
+0

@ Sarseth..yes that was working for me..my bad,filed .set()我以其他方式做...非常感谢。 –

2

你得到单元测试是错误的。它们不是测试内部实现(如字段或私有方法)。

的单元测试通常只能做以下的事情:

  1. 你“下的测试类”
  2. 你调用该对象的公共方法创建的对象;并且你对这些调用的结果“断言”(这将包括例如在这里或那里期望某些例外)。

换句话说:你非常想只有“测试类”您的外部可见行为测试。而且你知道:如果你的班级没有外部可见的行为 - 你为什么比在第一位?!

当然,有时候这并不“够好”。在这种情况下,你通常会这样做:转向一些嘲讽框架(如EasyMock或Mockito)来创建嘲笑的对象。你在实例化你的类时使用这些模拟(称为依赖注入)。通过这样做,你可以完全控制你的班级,例如,您可以验证您的模拟可以看到您期望的那些方法调用。

所以,长话短说:是的,这将有可能以某种方式访问​​您的课堂的测试领域。但是这导致了不值得这个名字的单元测试。因为只要开始重构代码的内部结构,那些测试就会中断。从这个意义上说:这样的测试只能证明你当前的实现按预期工作。但是,无论何时你改变某些东西,你都必须重做(可能更大!)部件或测试代码。

最后:写单元测试是一项需要学习的技能。最好的资源之一是那些videos