Mockito,如果我不关闭被Mock的静态方法会发生什么?

3
void givenStaticMethodWithNoArgs_whenMocked_thenReturnsMockSuccessfully() {
    MockedStatic<StaticUtils> utilities = Mockito.mockStatic(StaticUtils.class)
    utilities.when(StaticUtils::name).thenReturn("Eugen");
    assertThat(StaticUtils.name()).isEqualTo("Eugen");
    utilities.close();
}

我为什么需要关闭它?


2
谁说你需要关闭它? - maio290
@maio290,MockedStatic的JavaDoc已经说明了。当一个接口扩展java.lang.AutoCloseable时,这通常是一个提示,你应该调用close()方法,否则可能会发生资源泄漏或类似情况。 - Thomas Kläger
2个回答

5
javadoc所述:

如果此对象从未关闭,静态模拟将在初始化线程上保持活动状态。

由于该类实际上实现了AutoClosable接口,因此您可以简单地在try-with-resources中使用该类-这正如javadoc中建议的那样。请注意不要删除HTML标记。
 assertEquals("foo", Foo.method());
 try (MockedStatic mocked = mockStatic(Foo.class)) {
 mocked.when(Foo::method).thenReturn("bar");
 assertEquals("bar", Foo.method());
 mocked.verify(Foo::method);
 }
 assertEquals("foo", Foo.method());
 

如果您希望Mock在所有测试期间都处于活动状态,只需永远不关闭Mock即可。但是,如果这样做,我建议在init方法中而不是测试中这样做。然而,如果您的测试需要独立运行并且不显示此行为,则需要关闭Mock。


0
在我的情况下,当我没有将try放在try-with-resource中时,我的后续TCs / Junits开始失败了,不知道原因是什么。

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