代码之家  ›  专栏  ›  技术社区  ›  Ashish

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

  •  0
  • Ashish  · 技术社区  · 6 年前

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

    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而返回4.12345。when(),但我不确定如何测试 context 调用 process()

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Luke Woodward    6 年前

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

    Mockito创建的存根不会自动识别出您有一个getter和setter,getter应该返回setter上次调用的内容。它只是一个愚蠢的存根,只做你告诉它做的事,而你没有告诉它什么时候做 setValue() 被调用。

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

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

    另一种方法是创建测试 状态 类,并在测试中使用它。当然,能否做到这一点取决于这个类有多少其他方法。如果你要写这样一个类(我把它命名为 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);
    }