请注意,
Whitebox它始终在
org.mockito.internal包装中。除了增加主版本号外,还可以
internal指定该软件包可能会发生重大更改。
如果您确实希望在测试中设置否则无法访问的字段,则可以采用与之相同的方法
setInternalState,即仅在层次结构中标识该字段,对其进行调用
setAccessible,然后进行设置。完整代码在greppre上。您还可以检查多种其他方法来设置测试中的不可访问状态。
public static void setInternalState(Object target, String field, Object value) { Class<?> c = target.getClass(); try { Field f = getFieldFromHierarchy(c, field); // Checks superclasses. f.setAccessible(true); f.set(target, value); } catch (Exception e) { throw new RuntimeException( "Unable to set internal state on a private field. [...]", e); }}但是, 在这种情况下,我的一般建议是 停止使用这些工具
:Java的四个封装级别(公共,受保护,程序包,私有)不一定足以表达您要表达的保护程度,并且在尝试进行反思时,添加记录良好的初始化方法或构造函数重写来覆盖依赖关系通常要容易得多。如果将测试与所测试的类放在同一Java包中,则通常甚至可以将字段或方法/构造函数包设为私有,这也是设置并行源文件夹
src和
tests(表示)两个文件夹的好理由同一Java包的一半。
尽管有些人将这种额外的方法或构造函数视为“ API污染”,但我认为它是按照类中最重要的使用者之一的要求(即 自己的测试)进行
编码。如果您需要原始的外部接口,则可以轻松地单独定义一个接口,以便隐藏所需的任何细节。但是,您可能会发现自己 喜欢
将任何实际或模拟的实现直接注入到您现在更灵活的组件中的能力,此时,您可能希望研究依赖项注入模式或框架。



