我需要使用 mockito 使用 final 方法模拟一些类。我写过这样的东西
@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());
}
它有效,但“闻起来”。
那么,正确的方法在哪里呢?
谢谢。
原文由 Stan Kurilin 发布,翻译遵循 CC BY-SA 4.0 许可协议
Mockito 中不支持模拟 final 方法。
正如 Jon Skeet 评论的那样,您应该寻找一种方法来避免对 final 方法的依赖。也就是说,有一些方法可以通过字节码操作(例如使用 PowerMock)
Mockito 和 PowerMock 之间的比较 将详细说明事情。