是否可以使用 mockito 和 powermock 对具有 setter 和 getter 的方法进行单元测试

Is it possible to unit test a method which have setter and getter using mockito and powermock

我正在为遗留代码编写单元测试,它基本上是在使用链存根的方法中设置和获取值,我正在测试的 class 不依赖于其他 classes 所以我没有模拟任何东西,但有这样的方法

public class SampleClass {
  public void process(Context context){
    context.getState().setValue(MathUtil.roundToThree(context.getState().getValue());
  }
}

我写的测试class如下:

@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);
 }
}

测试用例失败,因为它由于 Mockito.when() 而返回 4.12345 但我不确定在调用 process() 方法后如何测试 context 对象中的值.

我无法更改源代码。 初始化上下文非常困难,因为它依赖于很多其他 类。请帮忙。

问题是您的存根 State 对象不知道 getValue() 编辑的值 return 应该是传递给 setValue() 的最后一个值.

Mockito 创建的存根不会自动识别您有 getter 和 setter 并且 getter 应该 return 什么 setter 最后一次被调用。它只是一个愚蠢的存根,它只做你告诉它做的事情,而你没有告诉它在调用 setValue() 时做任何事情。

可能最简单的方法是验证 setValue 是用四舍五入的值调用的,而不是尝试从 getValue():

中获取它
    Mockito.verify(context.getState()).setValue(AdditionalMatchers.eq(4.123, 0.0));

另一种方法是创建一个具有真实 getter 和 setter 的测试 State class,并在您的测试中使用它。当然,你能不能做到这一点取决于这个class还有多少其他方法。如果你要写这样一个class(我在下面的代码中将其命名为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);
}