【问题标题】: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();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-25
        • 1970-01-01
        • 2014-06-01
        • 2014-08-30
        • 2014-02-02
        • 2022-01-11
        相关资源
        最近更新 更多