如何在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);