mockito_什么是Mockito Extra接口?

mockito

mockito

如果要编写轻量级的JUnit测试, Mockito是我最喜欢的小帮手。 如有必要,可以通过模拟轻松地替换被测单元的“实际”依赖关系,这非常有用。 特别是在处理框架API的边界线时,这种依赖关系否则设置起来非常昂贵。

但是有时候情况要复杂一些。 例如,如果测试出于某种原因需要与至少一个属于这种框架的真实实例进行交互。 如果此交互包括将模拟作为参数传递给此实例,那么很幸运,实现会将参数强制转换为从交互器的角度来看未知的类型。

这是一个简单的例子来澄清这一点:

public interface Foo {
  [...]
}

public class Bar {

  public Bar( Foo foo ) {
    Runnable runnable = ( Runnable )foo;
    runnable.run();
  }

  [...]
}

public class SomeTest {

  @Test
  public void testConstructor() {
    Foo fooMock = mock( Foo.class );

    // fails with ClassCastException
    Bar bar = new Bar( fooMock );

    [...]
  }
}

Bar类视为期望某种实现的框架代码。 由于参数类型Foo不能反映这种期望,因此将Foo模拟传递给Bar的构造函数将导致测试失败,并带有ClassCastException

也许您在想到上述情况时首先想到的是,该框架通过强制转换为未声明的类型而变得很烂,并且最好将所有内容扔掉并重新开始,从而更好!

不幸的是,在现实世界中,这种行为可以说是有效的。 例如, Eclipse平台具有许多被声明为“不打算由客户端实现”的接口。 一个很好的例子是团队API的IHistoryView接口。 可以肯定地使用3.x平台,尽管IHistoryView实现扩展了IViewPart ,但是历史视图界面并未公开这一细节。

在这种情况下,有时可能需要创建多种类型的模拟-一种实现IHistoryViewIViewPart的模拟-尽管API并未指出所有这些。 Mockito通过鲜为人知的MockSettings#extraInterfaces模拟配置功能简化了此过程。 以下代码段显示了如何使用extraInterfaces修复上述示例的测试。

@Test
public void testConstructor() {
  Foo mock = mock( Foo.class,
                   withSettings().extraInterfaces( Runnable.class ) );

  // the mock now supports the cast to runnable
  Bar bar = new Bar( mock );

  [...]
}

使用withSettings的方法调用withSettings创建一个新的MockSettings实例,该实例将使用其他Runnable类型进行配置。 生成的Foo模拟实例同时实现FooRunnable 。 现在测试通过了。

但是请记住,尽管本文中使用额外接口的动机似乎是合理的,但要强调的是,在实际使用此功能之前,您应该三思而后行。 或如文档所述,“如果您碰巧经常使用它,请确保您确实在编写简单,干净且可读的代码。” 粗心地使用它绝对是一个预定的突破点。

翻译自: https://www.javacodegeeks.com/2014/03/what-are-mockito-extra-interfaces.html

mockito

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值