在作一个void方法的单元测试时,测试人员就比较迷惑了(很多人也都在问void方法怎么测试) , void的方法是没有返回值的方法。那么如何它的结果呢。
在这里和大家一起讨论一下void应该怎么测试。
首先站在测试角度来分析void方法, 每一个方法的设计都有特定功能的,在下面列一些void方法可能作的事(不是全部,只体现特征)
1、 在方法体内对私有的对象实例进行属性设置
2、作了日志输出
3、调用另外实例方法
4、初始化某个类型变量(可能是私有的或者全局的)
5、。。。。。。
如上分析void 方法里不是独立存在的,它的工作必定反映在某一个地方,可能是某个类,某个文件,某个服务。。。等等
其次分析void的所作工作反映或影响了那个地方,找到他后,找出办法来获取这个类, 这个文件,这个服务。。。
下面据一个常见的例子
public class ServiceHolder { private final Set<Object> services = new HashSet<Object>(); public void addService(Object service) { services.add(service); } public void removeService(Object service) { services.remove(service); } } |
我们要测试void addService (..) 这个方法,首先分析它的影响或作用, 它影响的services 这个变量,这个变量是个私有的。 测试这个方法的正确,就要验证services这个变量对象正确性。
如何获取这个私有变量? 我们用mock方法来作。
@Test public void testAddService() throws Exception { ServiceHolder tested = new ServiceHolder(); final Object service = new Object(); tested.addService(service); // 获得私有变量今昔国内验证 Set<String> services = Whitebox.getInternalState(tested,"services"); assertEquals("Size of the \"services\" Set should be 1", 1, services.size()); assertSame("The services Set should didn't contain the expect service", service, services.iterator().next()); } |
Whitebox.getInternalState(tested,"services"); 是powermocker提供的一个方法通过反射获得对象实例。
上面这个例子列出来一个简单的void测试方法, 根据不同的情况可能获取验证对象的方法不同,根据实际情况去考虑。
另外PowerMock中org.powermock.reflect.Whitebox 类提供了绕过封装的一些方法。
相关文章: