Mockito 3.4.0 静态模拟异常

Qum*_*bas 12 android mockito mockito-kotlin

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

对于SettingsUtility,当前线程中已经注册了静态mock,要创建新的mock,必须注销已有的静态mock注册

@Before
fun setUp() {
    mockStatic(SettingsUtility::class.java) {
        `when` { SettingsUtility.method(app) }.thenReturn { "" }}
}
Run Code Online (Sandbox Code Playgroud)

Sud*_*ppa 20

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

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

private static MockedStatic<SettingsUtility> mockedSettings;

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

@AfterAll
public static void close() {
    mockedSettings.close();
}
Run Code Online (Sandbox Code Playgroud)


a f*_*yer 18

以@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();
}
Run Code Online (Sandbox Code Playgroud)


San*_*ani 11

Mockito Inline 的工作原理与 Mockito 不同,因此失败了。因此需要做的是显式初始化和关闭模拟。

您需要为您的班级初始化mockedStatic

private MockedStatic<YourClassWithStaticMethod> mockedStatic;
Run Code Online (Sandbox Code Playgroud)

然后在BeforeEach和AfterEach中添加以下代码

@BeforeEach
  public void init() {
    mockedStatic = mockStatic(YourClassWithStaticMethod.class);
  }

@AfterEach
  public void cleanup() {
    mockedStatic.close();
  }
Run Code Online (Sandbox Code Playgroud)

现在您可以设定模拟的期望。

mockedStatic.when(YourClassWithStaticMethod::staticMethodToMock).thenReturn(yourReturnedMockedObject);
Run Code Online (Sandbox Code Playgroud)


Raj*_*mar 9

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

try(MockedStatic mocked = mockStatic(SettingsUtility.class)) {
        mocked.when(SettingsUtility::method).thenReturn("whatever you want");
    }
Run Code Online (Sandbox Code Playgroud)