我使用的是第三方库,它有一个抽象基类,应用程序代码应该扩展该抽象基类.然后,作为其处理的一部分,子类可以调用基类上的受保护方法.这是不是好的设计可以讨论,但事实就是这样.我想孤立地测试我的子类,因此存根基类的受保护方法.

我可以为子类的一个实例创建一个Mockito间谍,然后清除ABC的公共方法.然而,这对受保护的对象不起作用,因为以下情况显然是不允许的:

MySubclass obj = Mockito.spy(new MySubclass());
Mockito.when(obj.protectedMethod()).thenReturn(42); // error: protectedMethod() has protected access in AbstractBaseClass

是否有其他方法可以为该方法指定存根?

推荐答案

通过使用以下命令使其正常工作:

MySubclass obj = Mockito.spy(new MySubclass());

Mockito.when(obj.publicMethod()).thenReturn(5);

InvocationContainerImpl container = MockUtil.getInvocationContainer(obj);
InvocationFactory invocationFactory = new DefaultInvocationFactory();
Invocation invocation = invocationFactory.createInvocation(
    obj, new MockSettingsImpl<MySubclass>(),
    AbstractBaseClass.class.getDeclaredMethod("protectedMethod"), () -> null
);
container.resetInvocationForPotentialStubbing(new InvocationMatcher(invocation));
container.addAnswer(i -> 4, Strictness.LENIENT);

Assertions.assertEquals(9, obj.sum());

S不是很漂亮,但当隐藏在帮手方法后面时,S也不赖.它使用低于org.mockito.internal的包中的类,但它们被记录为公共API的一部分.

Java相关问答推荐

如何从片段请求数据到活动?在主要活动中单击按钮请求数据?

Spring Webocket:尽管凭据设置为False,但MLhttpsify和Fetch请求之间的CORS行为存在差异

错误:在Liferay7.4中找不到符号导入com.liferay.portal.kernel.uuid.PortalUUID;";

确定Java中Math.Ranb()输出的上限

为什么Java Annotation接口覆盖对象类中的方法

试着做一个2x2的魔方求解算法,我如何找到解路径(DFS)?

返回响应时,CamelCase命名约定不起作用

Arrays.hashcode(int[])为不同的元素提供相同的散列

类型集合的Jackson JsonNode:类型引用的对象读取器应该是Singleton吗?

如何将Java文档配置为在指定的项目根目录中生成?

扩展视图高度,并将其拖动到较低的视图上,而不是将其向下推?

如何用内置Java从JavaFX应用程序中生成.exe文件?

Java创建带有扩展通配符的抽象处理器

为什么在下面的Java泛型方法中没有类型限制?

对从Spring Boot 3.1.5升级到3.2.0的方法的查询验证失败

如何在Spring Boot Auth服务器上正确配置CORS?

如何设置默认序列生成器分配大小

原始和参数化之间的差异调用orElseGet时可选(供应商)

放置在变量中的Java成员引用不相等

单例模式中热切初始化和惰性初始化的区别