17

尝试模拟静态方法时出现以下异常。

对于 SettingsUtility,静态模拟已经注册在当前线程中要创建一个新的模拟,必须取消现有的静态模拟注册

@Before
fun setUp() {
    mockStatic(SettingsUtility::class.java) {
        `when` { SettingsUtility.method(app) }.thenReturn { "" }}
}
4

3 回答 3

32

返回对象的 MockedStatic.close() 方法必须在完成测试时调用,否则模拟将在当前线程上保持活动状态。

我不确定它是否与它在 Java 中的完成方式相同。希望这个 Java 代码片段有帮助

private static MockedStatic<SettingsUtility> mockedSettings;

@BeforeAll
public static void init() {
    mockedSettings = mockStatic(SettingsUtility.class);
}

@AfterAll
public static void close() {
    mockedSettings.close();
}
于 2020-08-07T18:38:58.783 回答
15

尝试这样做,您将不会收到此错误。它对我有用。

try(MockedStatic mocked = mockStatic(SettingsUtility.class)) {
        mocked.when(SettingsUtility::method).thenReturn("whatever you want");
    }
于 2020-08-07T03:23:26.870 回答
4

以@Sudha 的回答为基础。在 Java 中,您可以使用 @BeforeClass 和 @AfterClass

private static MockedStatic<SettingsUtility> mockedSettings;

@BeforeClass
public static void init() {
    mockedSettings = mockStatic(mockedSettings.class);
}

@AfterClass
public static void close() {
    mockedSettings.close();
}
于 2021-06-03T09:57:51.913 回答