最后的方法嘲笑

我需要使用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()); } 

它有效,但“闻起来”。

那么,正确的方法在哪里?

谢谢。

Mockito不支持嘲笑最终的方法。

正如Jon Skeet评论说的,你应该寻找一种避免依赖最终方法的方法。 也就是说,通过字节码操作有一些方法(例如PowerMock)

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

从Mockito FAQ :

Mockito有什么限制

  • 不能嘲笑最终的方法 – 他们的真实行为是毫无例外的执行。 Mockito不能警告你嘲笑最后的方法,所以要提高警惕。

你可以和Mockito一起使用Powermock,那么你不需要inheritanceB.class。 只需将其添加到testing类的顶部

 @RunWith(PowerMockRunner.class) @PrepareForTest(B.class) 

@PrepareForTest指示Powermock仪器B.class使最后和静态方法可以嘲笑。 这种方法的一个缺点就是你必须使用PowerMockRunner,这样可以避免使用其他testing运行器,比如Springtesting运行器。

Mockito 2现在支持嘲笑最终的方法,但这是一个“孵化”function。 它需要一些步骤来激活它在这里描述: https : //github.com/mockito/mockito/wiki/What's-new-in-Mockito-2#mock-the-unmockable-opt-in-mocking-of-最终classesmethods

假设B类如下:

 class B { private String barValue; public final String bar() { return barValue; } public void final setBar(String barValue) { this.barValue = barValue; } } 

有没有更好的方法来做到这一点,而不使用PowerMockito框架。 你可以为你的class级创build一个SPY,并且可以嘲笑你最后的方法。 以下是做到这一点的方法:

 @Test public void test() { B b = new B(); b.setBar("bar called") //This should the expected output:final_method_bar() B spyB = Mockito.spy(b); assertEquals("bar called", spyB.bar()); } 

我只是做了同样的事情。 我的情况是,我想确保该方法没有“导致”一个错误,但由于它是一个catch / log / return方法,我不能直接testing它没有修改类。

我只是简单地模拟我传入的logging器,但是嘲笑“Log”接口似乎并不奏效,而像“SimpleLog”这样的类没有工作,因为这些方法是最终的。

我最终创build了一个匿名的内部类,扩展了SimpleLog,覆盖了其他所有委托的基本级别的“日志(级别,string,错误)”方法,然后等待5级的调用。

一般来说,扩展行为类并不是一个坏主意,如果不是太复杂,反正可能更好。