是否可以使用mockito和powermock

时间:2018-05-10 17:34:24

标签: java junit mockito powermock

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

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

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

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

1 个答案:

答案 0 :(得分:0)

问题是,您的存根State对象不知道getValue()返回的值应该是传递给setValue()的最后一个值。

Mockito创建的存根不会自动获取你有一个getter和setter,而getter应该返回最后一次调用setter的内容。它只是一个愚蠢的存根,只能按照你所说的去做,并且在调用setValue()时你还没有告诉它做任何事情。

最简单的方法是验证使用舍入值调用setValue,而不是尝试从getValue()获取它:

    Mockito.verify(context.getState()).setValue(AdditionalMatchers.eq(4.123, 0.0));

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