【发布时间】:2011-04-17 03:59:02
【问题描述】:
我需要使用 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";
}
}
但它失败了。 我尝试了一些“hack”并且它有效。
@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());
}
它有效,但“有味道”。
那么,正确的方法在哪里?
谢谢。
【问题讨论】:
-
当然,理想的情况是不需要模拟 final 方法。你没有告诉我们你为什么要这么做。我通常会努力保持对接口的依赖...有什么方法可以使用代理到真实类的接口(假设你不能更改类本身)?
-
这个类来自一些遗留代码。
-
没有修改选项吗?或者通过另一个实现接口的类来代理它?
-
@Jon Skeet:我无法修改它。你看,它是库(SWT)。有接口IFigure和实现-Figure。但 IFigure 不包含 getLocation()。
-
@Jon Skeet:抱歉,不是 SWT。它是 org.eclipse.draw2d。
标签: java unit-testing testing mocking mockito