Jmockit:不能模拟net.android.Uri类的toString方法

IDE:Android Studio 2.2.2 | Jmockit:2.1 | Java:1.8.0_102-b14

我试图模拟类net.android.Uri的方法toString()。 这个类上的所有方法都可以模拟OK,但是toString()方法。

@Test public void method(@Mocked final Uri uri) throws Exception { new NonStrictExpectations() { { uri.getHost(); result = "sendViewLog"; uri.getAuthority(); result = "getAuthority"; uri.getEncodedFragment(); result = "getEncodedFragment"; uri.getPort(); result = 8080; uri.toString(); // <------- result = "helloWorld"; } }; sut.method(); } 

结果:但是toString()返回null值,上面的所有方法都被模拟了。 你能给我一些解决方法来解决这个问题。

PS1:我意识到当我将鼠标hover在Expectations块内的toString方法时。 它显示此警告消息:

报告对忽略该调用结果的特定方法的任何调用。 检查使用org.jetbrains.annotations.Contract(pure = true)注释的检查设置和方法中指定的两种方法。 对于许多方法,忽略结果是完全合法的,但对于某些方法,它几乎肯定是一个错误。 忽略调用结果可能是错误的方法示例包括java.io.inputStream.read(),它返回实际读取的字节数,java.lang.String或java.math.BigInteger上的任何方法因为所有这些方法都是无副作用的,因此如果被忽略则毫无意义。

PS2:当我通过uri实例检查null时,它会通过。 但是,我要检查的客户端代码是uri.toString()。contains(“/ video”)原因uri.toString() == null,所以contains(“/ video”)抛出NullPointerException。

开发人员回答:

是的,只能实现(使用正文,而不是抽象)toString()方法可以被模拟。

https://github.com/jmockit/jmockit1/issues/381