java - 是否可以使用 mockito 和 powermock 对具有 setter 和 getter 的方法进行单元测试
问题描述
我正在为遗留代码编写单元测试,该代码基本上是使用链存根在方法中设置和获取值,我正在测试的类不依赖于其他类,所以我没有模拟任何东西,但有这样的方法
public class SampleClass {
public void process(Context context){
context.getState().setValue(MathUtil.roundToThree(context.getState().getValue());
}
}
我写的测试类如下:
@RunWith(MockitoJUnitRunner.class)
public class TestSampleClass{
SampleClass sample = new SampleClass();
@Test
public void testProcess(){
Context context = Mockito.mock(Context.class, Mockito.RETURNS_DEEP_STUBS);
Mockito.when(context.getState().getValue()).thenReturn(4.12345);
sample.process(context);
assertEquals(4.123,context.getState().getValue(),0.0);
}
}
context
测试用例失败,因为由于 Mockito.when() 它正在返回 4.12345 但我不确定在调用该process()
方法后如何测试对象中的值。
我无法更改源代码。初始化上下文非常困难,因为它依赖于许多其他类。请帮忙。
解决方案
问题是您的存根State
对象不知道返回的值getValue()
应该是传递给的最后一个值setValue()
。
Mockito 创建的存根不会自动发现您有一个 getter 和 setter,并且 getter 应该返回最后一次调用 setter 的内容。它只是一个愚蠢的存根,只做你告诉它做的事情,而你没有告诉它在setValue()
被调用时做任何事情。
setValue
验证使用舍入值调用的方法可能最简单,而不是尝试从以下位置获取它getValue()
:
Mockito.verify(context.getState()).setValue(AdditionalMatchers.eq(4.123, 0.0));
另一种方法是创建一个State
具有真正 getter 和 setter 的测试类,并在测试中使用它。当然,能不能做到这一点,就看这个类还有多少其他的方法了。如果您要编写这样一个类(我TestState
在下面的代码中命名它),测试代码将如下所示:
@Test
public void testProcess2(){
Context context = Mockito.mock(Context.class);
Mockito.when(context.getState()).thenReturn(new TestState());
context.getState().setValue(4.12345);
sample.process(context);
assertEquals(4.123,context.getState().getValue(),0.0);
}
推荐阅读
- c# - 如何使损害客户端团结一致?
- python - 使用漂亮的汤 python 从标签中提取 html ID
- javascript - 声明接口而不是类型
- vue.js - 将 v-bind 添加到属性时 v-dialog 的 v-btn 消失
- c# - 我们如何在 PDFLib set-graphics-option 中传递专色值列表?
- javascript - 使用 map() 从另一个数组元素值更改数组元素顺序
- node.js - 使用 npm 和 Zurb Foundation 安装 Swup 的问题
- python - 使用 Beautiful Soup 4 提取带有连字符的属性值
- ruby - 创建带索引的数组,并与其他数组进行比较
- mount - 如何在 Linux 中挂载非超级用户可以写入的驱动器