【问题标题】:Mockito 3.4.0 Static Mocking ExceptionMockito 3.4.0 静态模拟异常
【发布时间】:2020-08-05 10:55:17
【问题描述】:
我在尝试模拟静态方法时遇到以下异常。
对于 SettingsUtility,静态模拟已在
当前线程要创建一个新的mock,现有的静态mock
必须注销注册
@Before
fun setUp() {
mockStatic(SettingsUtility::class.java) {
`when` { SettingsUtility.method(app) }.thenReturn { "" }}
}
【问题讨论】:
标签:
android
mockito
mockito-kotlin
【解决方案1】:
必须在完成测试时调用返回对象的 MockedStatic.close() 方法,否则模拟将在当前线程上保持活动状态。
我不确定它是否与它在 Java 中的完成方式相同。希望这个 Java 代码 sn-p 有帮助
private static MockedStatic<SettingsUtility> mockedSettings;
@BeforeAll
public static void init() {
mockedSettings = mockStatic(SettingsUtility.class);
}
@AfterAll
public static void close() {
mockedSettings.close();
}
【解决方案2】:
尝试这样做,您将不会收到此错误。它对我有用。
try(MockedStatic mocked = mockStatic(SettingsUtility.class)) {
mocked.when(SettingsUtility::method).thenReturn("whatever you want");
}
【讨论】:
-
对我来说,一个 Testclass 提供了一些非常好的见解,如何使用新的 statickMock-Feature:StaticMockTest.java(使用 try-Block/call close 非常重要)。
-
-
【解决方案3】:
以@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();
}