最终方法模拟

2022-08-31 13:40:11

我需要使用mockito用最终方法模拟一些类。我写过这样的东西

@Test
public void test() {
    B b = mock(B.class);
    doReturn("bar called").when(b).bar();   
    assertEquals("must be \"overrided\"", "bar called", b.bar());
    //bla-bla
}


class B {
    public final String bar() {
        return "fail";
    }
}

但它失败了。我尝试了一些“黑客”,它的工作原理。

   @Test
   public void hackTest() {
        class NewB extends B {
            public String barForTest() {
                return bar();
            }
        }
        NewB b = mock(NewB.class);
        doReturn("bar called").when(b).barForTest();
        assertEquals("must be \"overrided\"", "bar called", b.barForTest());
    }

它有效,但“闻起来”。

那么,哪里是正确的方法呢?

谢谢。


答案 1

Mockito FAQ

Mockito的局限性是什么

  • 无法模拟最终方法 - 它们的真实行为无一例外地执行。Mockito不能警告你嘲笑最终的方法,所以要保持警惕。

答案 2

在 Mockito 中不支持模拟最终方法。

正如Jon Skeet所评论的那样,你应该寻找一种方法来避免对最终方法的依赖。也就是说,通过字节码操作(例如,使用PowerMock)有一些方法可以解决。

Mockito和PowerMock之间的比较将详细解释事情。


推荐