【问题标题】:Mocking private method call using PowerMockito returns null instead of returning List<String>: (Want not to execute private method)使用 PowerMockito 模拟私有方法调用返回 null 而不是返回 List<String>:(不想执行私有方法)
【发布时间】:2019-08-29 04:57:08
【问题描述】:

我正在尝试使用 JUnit4 对方法进行单元测试。被测方法正在调用另一个私有方法,我想使用 PowerMockito 模拟它。

我的方法如下:

Class MyClass {
    public List<String> myMethod(String name) throws IOException
    {
       ... Few lines of code for setting variables
       List<String> result = myPrivateMethod(a, b);

       ... Few more lines of code..
       result.addAll(myPrivateMethod(c, d)); 

       return result;
    }

    private List<String> myPrivateMethod(String a, String b) {
    .....
    }
}

我测试上述代码的单元测试方法如下:

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)
public class TestClass {

  @Test
  public void testMyMethod() throws Exception {
    MyClass myClass = PowerMockito.spy(new MyClass());
    PowerMockito.doReturn(new ArrayList<String>(){{add("temp");}}).when(myClass, "myPrivateMethod", "a", "b");
    List<String> list = myClass.myMethod("someName");
    assertEquals(list.size(), 1);
  }
}

我期待行 PowerMockito.doReturn(new ArrayList(){{add("temp");}}).when(myClass, "myPrivateMethod", "a", "b"); 返回大小为 1 的列表。我验证了执行不会进入私有方法,但我没有得到添加一个值的列表。

上面的单元测试代码有什么问题,为什么我得到 null 而不是 PowerMockito.doReturn() 方法中提到的填充列表?

【问题讨论】:

标签: java unit-testing junit4 powermockito


【解决方案1】:

在您的测试中,您正在调用 myMethod,而后者又调用了两次 myPrivateMethod,请参阅:

List<String> result = myPrivateMethod(a, b);
...
result.addAll(myPrivateMethod(c, d));

但您的测试只模拟了一次对myPrivateMethod 的调用,因此流程如下所示:

  1. myMethod -> myPrivateMethod 其中参数是 a, b - 这 模拟,myPrivateMethod 返回“temp”
  2. myMethod -> myPrivateMethod 其中参数是 c, d - 这 不是 模拟的,因此 myPrivateMethod 被执行

为了使此断言通过:assertEquals(list.size(), 1);,您需要重新编写测试以模拟对myPrivateMethod 的第二次调用。此外,对“返回 null”的引用表明此处的 when 块:.when(myClass, "myPrivateMethod", "a", "b") 与您的 myMethod 中提供的实际参数不匹配。

这是一个工作示例:

public class MyClass {
    public List<String> myMethod(String name) throws IOException {
        List<String> result = myPrivateMethod("a", "b");
        result.addAll(myPrivateMethod("c", "d"));
        return result;
    }

    private List<String> myPrivateMethod(String a, String b) {
        List<String> r = new ArrayList<>();
        r.add(a);
        r.add(b);
        return r;
    }
}

@Test
public void testMyMethod() throws Exception {
    MyClass myClass = PowerMockito.spy(new MyClass());

    PowerMockito.doReturn(new ArrayList<String>(){{add("temp");}})
        .when(myClass, "myPrivateMethod", "a", "b");

    PowerMockito.doReturn(new ArrayList<String>())
        .when(myClass, "myPrivateMethod", "c", "d");

    List<String> list = myClass.myMethod("someName");
    assertEquals(1, list.size());
    assertEquals("temp", list.get(0));
}

上面的示例测试通过了以下内容:

  • 六月:4.12
  • powermock-module-junit4: 2.0.2
  • powermock-api-mockito2: 2.0.2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 2017-06-20
    • 2015-03-23
    • 2014-10-15
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多