【问题标题】:How to Mock instanceof in Mockito如何在 Mockito 中模拟 instanceof
【发布时间】:2015-02-20 13:07:38
【问题描述】:

我有一段代码,我想用 Mockito 测试一下:

mockedClass instanceof SampleInterface

mockedClass 是模拟抽象类:MockedClassSampleInterface 是一个接口。这是失败点:

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

如何模拟这段代码?

【问题讨论】:

  • 澄清一下,mockedClassMockedClass 类型的模拟实例(即mock(MockedClass.class))和MockClass 实现SampleInterface
  • 实现mockedClass的类实现了这个SampleInterface。我没有写重要信息:那个mockedClass是一个Abstract class,mocked like mock(MockedClass.class)。

标签: java unit-testing mocking mockito


【解决方案1】:

听起来你需要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() 不可用。
  • 但这是我搜索的内容!
  • 很高兴为您提供帮助!这些功能是 Mockito 1.8 的新功能,从 2009 年左右开始,因此可能值得升级。最新的 Mockito 版本是 1.10,2.0 即将发布。
【解决方案2】:

除了其他答案:

如果可能,您应该改为模拟界面,这意味着像这样创建模拟:

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

【讨论】:

  • 这值得一试。
猜你喜欢
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多