如何在Mockito中模拟instanceof

15

我有一段代码,想要使用Mockito进行测试:

mockedClass instanceof SampleInterface

mockedClass 是被模拟的抽象类:MockedClass,而 SampleInterface 是一个接口。这是失败的关键点:

Validate.isTrue(mockedClass instanceof SampleInterface, "The mockedClass is not a SampleInterface");

如何模拟这段代码?


1
只是为了澄清,mockedClassMockedClass 类型的模拟实例(即 mock(MockedClass.class)),而 MockClass 实现了 SampleInterface 接口吗? - Jonathan
实现MockedClass的类实现了SampleInterface接口。 我没有写一个重要的信息:mockedClass是一个抽象类,像mock(MockedClass.class)这样模拟。 - Gábor Csikós
2个回答

30

看起来您需要使用MockSettings.extraInterfaces方法。

MockedClass mockedClass = mock(MockedClass.class,
    withSettings().extraInterfaces(SampleInterface.class));

注意,它带有自己的警告标签:

这个神秘的功能应该非常偶尔地使用。被测试对象应该清楚地知道它的合作者和依赖项。如果你经常使用它,请确保你真正产生了简单、清晰和可读的代码。

作为替代方案,创建一个测试接口,扩展所有你想要模拟实现的接口,并以通常的方式进行模拟。

public abstract class ForTest implements SampleInterface {}

MockedClass mockedClass = mock(ForTest.class);

withSettings() 无法编译。我认为我正在使用较旧版本的Mockito,其中未提供 withSettings()。 - Gábor Csikós
但这就是我所寻找的! - Gábor Csikós
很高兴能帮忙!这些功能是自Mockito 1.8(约2009年左右)以来的新功能,因此升级到最新版本可能是值得的。最新的Mockito版本是1.10,2.0即将发布。 - Jeff Bowman

2

除了其他答案之外:

如果可能的话,最好模拟接口,也就是像这样创建模拟:

SampleInterface mockedClass = mock(SampleInterface.class); // not mock(MockedClass)

值得一试。 - Vishwa Ratna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接