【问题标题】:Bypass static method in Mockito在 Mockito 中绕过静态方法
【发布时间】:2020-11-29 19:58:18
【问题描述】:

我正在使用 Mockito 编写 JUnit 测试用例,并试图绕过我的测试方法中的静态方法调用。我在运行测试用例时收到了NullPointerException

是否有任何方法可以绕过上述调用而不使用PowerMockito 或者在下面提到的方法中需要哪些修复?

下面是帮助你理解问题的代码sn-ps:

=>这是我想使用 Mockito 编写 JUnit 测试用例的代码。

class MyClassToTest{
    public void methodToTest(){
        JsonObject obj = MyUtilClass.staticMethod(arg1);
    }
}

=>下面是MyUtilClass的定义:

class MyUtilClass{
    public static JsonObject staticMethod(JsonObject arg1){
        //use arg1 to populate return object 
        return jsonobject;
    }
}

=>下面是我当前的测试类和测试方法如何查找MyClassToTest.methodToTest的sn-p

  class MyTestClass{
    public void test_methodToTest(){
        JsonObject dummy_jsonObject = new JsonObject().put("foo","foo");
        doReturn(dummy_jsonObject).when(MyUtilClass.staticMethod(any()));
    }
 }

【问题讨论】:

  • 你能在MyTestClass 测试套件中模拟arg1 变量吗?
  • "有没有什么方法可以绕过上面提到的调用而不使用PowerMockito 或者在下面提到的方法中需要什么修复?" - 由于 v3.4.0 @987654321 @
  • @marcin.programuje,不,arg1 无法模拟,因为它是一个巨大的 Json 有效负载。
  • 如果您可以更改测试代码,最简单的解决方案是将静态方法的调用移动到自己的方法中(例如,使用包范围)并简单地存根此方法。
  • @Coder3108 huge 没有真正准确的含义。也许您应该尝试模拟它而不是模拟静态方法。

标签: java junit mockito static-methods


【解决方案1】:

如果您想使用 Mockito(需要 3.4.0 或更高版本)从 MyUtilClass 模拟您的 staticMethod,则存根如下所示(我假设您使用的 Java 版本 > 9):

@Test
void shouldMockStatic() {
  JsonObject dummy_jsonObject = new JsonObject().put("foo","foo");
  try (MockedStatic<MyUtilsClass> mockedStatic = Mockito.mockStatic(MyUtilsClass.class)) {
    mockedStatic.when(() -> MyUtilsClass.staticMethod(anyString()).thenReturn(dummy_jsonObject);

    // now invoke your class under test
  }
}

您可以找到有关 Mockito here 的此功能的更多信息和示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2014-02-02
    相关资源
    最近更新 更多