如何在unit testing时使用jmockit将空字符串传递给私有方法?
下面是我的DataTap
类中的私有方法,我试图使用jmockit对这个私有方法进行junit测试 –
private void parseResponse(String response) throws Exception { if (response != null) { // some code } }
所以下面是我写的junit测试但是对于null情况,它会在junit测试本身上以某种方式抛出NPE。
DataTap tap = new DataTap(); Deencapsulation.invoke(tap, "parseResponse", "hello"); // this line throws NPE Deencapsulation.invoke(tap, "parseResponse", null);
所以我的问题是 – 有没有什么方法可以使用JMOCKIT作为junit测试的一部分将null string
传递给parseResponse
方法?
这就是我在这条线上看到的 –
类型为null的参数应显式转换为Object [],以便从Deencapsulation类型调用varargs方法invoke(Object,String,Object …)。 也可以将其转换为Object以进行varargs调用
快速浏览文档表明,您尝试使用该签名进行的操作是不可能的:
…如果需要传递null值,则必须传递参数类型的Class对象
如果是这种情况,则传入Class
对象以及实例。
Deencapsulation.invoke(tap, "parseResponse", String.class);
做错误说的。 也就是说,将行更改为:
Deencapsulation.invoke(tap, "parseResponse", (Object) null);
当我需要在toString方法中传递null String时,我确实喜欢这样,即通过将null
转换为必需的类型
mockedObject.toString((String) null)
您正在使用便捷方法,您需要使用完整的方法。 有两种方法可以在对象实例上调用方法。 第一种方法通过从nonNullArgs获取parameterTypes来工作。
Deencapsulation.invoke(instance, methodName, nonNullArgs); Deencapsulation.invoke(instance, methodName, parameterTypes, methodArgs);
如果其中一个args为null,则需要传入parameterTypes:
DataTap tap = new DataTap(); String response = null; Class[] parameterTypes = { String.class }; Deencapsulation.invoke(tap, "parseResponse", parameterTypes, response);