Spring测试:全局模拟静态方法

3
在Spring测试中,我知道可以使用Mockito模拟静态方法(通常是静态工具方法:生成ID,从Redis获取值),例如:
try (MockedStatic) {
}

但是在每个测试方法中这样做很丑陋和繁琐,是否有一种方法可以完成所有工作(我可以使用单个模拟行为)?

我在考虑可能需要一个JUnit5扩展或Mockito扩展,这似乎是一个常见的问题,我想知道是否有人尝试过并取得了成功。

1个回答

2
尝试这个。
public class StaticClassTest {

    MockedStatic<YourStatic> mockedStatic;

    @Before
    public void setup() {
        mockedStatic = Mockito.mockStatic(YourStatic.class);

        // if you want the same behavior all along.
        mockedStatic.when(() -> YourStatic.doSomething(anyString())).thenReturn("TEST");
    }
    
    @Test
    public void test_static() {
        // write your test here
    }


    @After
    public void teardown() {
        mockedStatic.close();
    }
}

为什么我必须在@aftereach中关闭它? - danny
这是 MockedStatic 的标准实践,就像在 SQL 查询后关闭 DB 连接一样。因此,您可以在每个测试用例中使用 try-with-resources(就像您的示例)或者使用我的答案。更多信息请参见:https://www.baeldung.com/mockito-mock-static-methods#mocking-a-no-argument-static-method - Kai-Sheng Yang
如果我想要一直保持相同的行为,这样我就不必关闭它了吗? - danny
我建议每次都进行设置/拆卸,否则在某些复杂情况下可能会出现并发问题。每次进行设置/拆卸可以使每个测试用例更加独立和清晰。顺便说一句,我已经改进了我的答案,使得模拟对象始终具有相同的行为。 - Kai-Sheng Yang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接