mockito 我正在为一个静态类创建单元测试,它有来自同一个类的另一个静态方法的方法调用?如何可以模拟那个方法调用?

2eafrhcq  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(127)

如何为testAble()方法创建单元测试并模拟something()方法的行为?

public class MyClass {
    public static String something() {
        return "Hello";
    }

    public static String testAble() {
        if (something().equals("Hello")) {
            return "Wow";
        }
        return "LoL";
    }
}

我试着用Mockito来做,但我知道我们不能用Mockito来模拟静态。

eit6fx6z

eit6fx6z1#

从Mockito版本3.4.0开始,在使用mockito-inline依赖项时可以模拟静态方法-请参阅:Mockito文档或you can read more here
在您的情况下,它看起来像这样:

@Test
void notHelloTest() {
    try (var mocked = Mockito.mockStatic(MyClass.class, CALLS_REAL_METHODS)) {
        mocked.when(MyClass::something)
              .thenReturn("not hello");

        var result = MyClass.testAble();

        assertEquals("LoL", result);
    }
}

@Test
void helloTest() {
    try (var mocked = Mockito.mockStatic(MyClass.class, CALLS_REAL_METHODS)) {
        mocked.when(MyClass::something)
              .thenReturn("Hello");

        var result = MyClass.testAble();

        assertEquals("Wow", result);
    }
}

请注意传递给mockStatic方法的CALLS_REAL_METHODS参数(从org.mockito.Answers静态导入)-它是必需的,因为我们正在测试我们正在模拟的同一个类。如果没有它,MyClass.testAble()将返回null,因为我们没有定义它的行为(我们想要测试它,而不是模拟它)。
我已经创建了一个GitHub repository复制你的问题,我还添加了上面的测试-他们都通过了。
附加说明:你可以通过使用非静态方法而不是静态方法来解决这个问题,并将你的类的示例注入到另一个类中(并在测试中注入test double)。Dependency injection mechanisms让我们轻松。
您可能还想了解try-with-resources block-静态模拟仅在try块内工作,并且当块结束时,静态模拟将关闭。

相关问题