java - 如何模拟 someObj.meth1(...).meth2(...)?

标签 java junit mockito powermock

我有一个 map 对象的模拟

@Mock
Map<String, Object> statusNode;

我写这个是为了减少代码量

when(statusNode.get("ratePlanId")).thenReturn(
                    when(mock(Number.class).longValue()).thenReturn(200L).getMock()
    );

但它抛出异常:

org.mockito.exceptions.misusing.UnfinishedStubbingException:

我可以使用其他方式来做到这一点,但是代码太多,而且我应该使用过多的变量初始化操作

Number number = mock(Number.class);
when(number.longValue()).thenReturn(100L);
when(statusNode.get("subscriberStatusId")).thenReturn(number);

常见的情况是:如何在不进行变量初始化操作的情况下模拟这样的东西?

someObj.get("standardId").longValue();

最佳答案

您的问题是,当您开始 stub 第二个模拟时,第一个 when 已经运行。在 Mockito 中,一次只能 stub 一个方法。您可以做的是将内部模拟分配给这样的局部变量。

Number innerMock = when(mock(Number.class).longValue()).thenReturn(200L).getMock();
when(statusNode.get("ratePlanId")).thenReturn(innerMock);

这会起作用。但是,模拟您不拥有的类型有点像测试反模式。如果您可以在不模拟 Number 类的情况下测试它,那就更好了。

when(statusNode.get("ratePlanId")).thenReturn(Long.valueOf(200L));

关于java - 如何模拟 someObj.meth1(...).meth2(...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38697409/

相关文章:

junit - 如何在Gradle的测试任务中指定@category?

java - Mock方法实现Junit mockito

spring-boot - 模拟一个服务类,并依赖于另一个服务类 Mockito

java - 当 JCheckBox 未选中时,使光标周围的 ZoomBox 消失

Java监控: JMX vs. Servlets

android - 如何自动化 android 的升级测试

java - JUnit + Derby + Spring : drop in-memory db after every test

java - 如何使用 Lucene 中的 MultiFieldQueryParser?

java - 在 JTable 上动态调整行高

java - 在不创建文件的情况下测试 outputstream.write(<String>)