回到监狱般的实验室,用一台4年前的废电脑,装一个ubuntu来玩玩吧。
消息非常明显:你不能模拟非可视类和 final 类。简短回答:创建匿名的anonymous类,而对这个类进行收费,而不是 !
长答案,让我们来解释 !
如果编译器看到匿名类,则实例化一个匿名类,它将创建一个的final 和的包可见类。因这里,匿名类通过标准的均值 换句话说,并不是mockable的。
假设你想通过Powermock模拟这个匿名类。当前编译器使用以下方案编译匿名类:
模拟匿名类可能但脆弱的( 我的意思是) 所以假定匿名类是声明的第十一个类,它将显示为
因此,你可以为测试匿名类做好准备:
这里代码将编译,但最终将报告为你的IDE的错误。IDE可能不了解 InputHelper$11.class
。IntelliJ不使用编译的类来检查代码报表。
另外,匿名类命名实际上依赖于声明的顺序是一个问题,当有人添加了另一个匿名类时。匿名类要保持匿名,如果编译人员决定一天使用字母或者随机标识符,则为匿名类。
在中模拟匿名类是可能的,但是很脆弱,不要在实际项目中做 !
EDITED: 编译器有不同的编号方案,它总是使用一个位数:
而且我不认为JLS清楚地指定了编译器应该如何处理匿名类。
我更愿意编写下面的代码:
一个将使用命名类的输入 helper,我不使用接口 NAME 来清楚该过滤器的意图。
现在,你可以编写这样的测试:
BufferedInputStream
,那么最终可以避免powermock的测试。通常使用Powermock意味着设计出了问题。我认为Powermock对于传统的软件很好,但是在设计新的代码时可能会盲目开发,因为他们缺少oop部分的优点,我甚至说他们正在设计遗留代码。