mockito_吸收Mockito的流利度

mockito

我最近发现自己编写了一些代码来集成两个不同的平台。 这些系统之一是基于Java的系统,而另一个虽然不是用Java编写的,却提供了Java API。 我将这些系统分别称为Foo和Bar。 莫基托

在我编写一行代码之前就很明显了,但是,测试最终的适配器将需要我显式地模拟后来的系统的API(即Foo),因为我所需要的只是一个jar文件,其类和方法清楚了他们与一个实例进行了交流。

我花了几个周期来查看Java 模拟世界中的新功能,并且很高兴看到我的老朋友Mockito仍然很活跃,并且确实仍然是通用模拟出色工具 。 对于初学者来说, Mockito是基于Java的模拟框架,它可以:

…味道真的很好。 它使您可以使用[a]简洁的API编写漂亮的测试。 Mockito不会给您带来麻烦,因为测试的可读性很强,并且会产生清晰的验证错误。

Google代码模拟项目页面 –为什么喝呢?

实际上,Mockito提供了一个简单,流畅的API ,使您可以精确地模拟行为而无需大惊小怪。 例如,与Bar进行交互的主要外观是通过QTP类,该类具有诸如logInlogOut等方法。与其依靠被测类实际调用这些方法,我还可以像这样轻松地使用Mockito创建QTP模拟实例。 :

模拟QTP实例
QTP qtpThing = mock(QTP.class);

其中, mock是从org.mockito.Mockito静态导入的方法。 使用模拟实例,然后我可以指示希望某些方法的行为, 只要我将此模拟实例传递给受测类即可

例如,方法logIn不返回任何内容。 实际上,必须先调用该方法,然后再调用另一种方法以生成票证(或令牌),该票证将在后续方法调用中使用。 因此,我正在编写的适配器将接收一些输入值(从Foo以XML形式),并且适配器将返回票证(按照Foo所需的XML模式以XML文档的形式)。

因此,测试这种交互作用,我需要做两件事:

  • 确保使用特定参数调用logIn方法
  • 通过getTicket方法模拟有效票证的响应

而且,我还要验证logIn失败是否导致适配器代码中发生特定的交互。 因此,我还需要模拟一些异常行为。

在模拟特定方法的情况下,您只需将几个方法链接在一起即可。 在我的情况下, when and thenReturn可以像这样进行操作:

模拟getTicket的行为
when(qtpThing.getTicket()).thenReturn("test-ticket");

在上面的代码中,当在我的模拟实例上调用getTicket方法时,将返回String “ test-ticket”。

接下来,为了确保使用从传入XML文档获得的参数调用logIn ,我可以使用Mockito的verify方法。

使用Mockito的验证来确保正确的交互
verify(qtpThing, times(1)).logIn("some_value", "some_user_name", "password");

在这种情况下, verify方法将检查一次logIn是否被调用,以及是否传入了三个特定的String值。如果不满足这些期望,Mockito将抛出异常(并且您相应的测试用例将失败)。

因此,用于验证适配器的测试用例非常简单,但可读性很高。

用于验证登录行为的JUnit测试用例
@Test
public void testLoginRequest() throws Exception {
  QTP qtpThing = mock(QTP.class);
  when(qtpThing.getTicket()).thenReturn("test-ticket");
  AdapterRequest request = new AdapterRequest(XML.read("etc/test-login-req.xml"));
  QbosAdapter adapter = new QbosAdapter();
  adapter.setQtpInstance(qtpThing);
  AdapterResponse adapterResponse = adapter.performAction(request);
  assertNotNull(adapterResponse);
  verify(qtpThing, times(1)).logIn("some_value", "some_user_name", "password");
  assertEquals("test-ticket", adapterResponse.getData().getText());
}

如果我需要模拟QTP对象抛出的异常,表面QTP是由于登录期间参数无效或凭证不正确怎么办? 同样,Mockito的流畅API使这一切变得轻而易举。

就我而言,我希望logIn方法将其检查过的方法之一抛出其名为UnknownQtpException方法签名中。 您可以通过doThrowwhen方法执行此操作。

模拟出Mockito中的异常
doThrow(new UnknownQtpException()).when(qtpThing).logIn("", "blah", "blah");

在上面的代码中,我明确声明,如果logIn命令的第一个参数为空,则UnknownQtpException QTP实例应抛出UnknownQtpException 。 将所有内容放在一起将产生以下测试用例:

使用JUnit和Mockito测试异常情况
@Test
public void testFailureLoginRequest() throws Exception {
  QTP qtpThing = mock(QTP.class);
  doThrow(new UnknownQtpException()).when(qtpThing).logIn("", "blah", "blah");
  XML xml = XML.read("etc/test-login-req-err.xml");
  AdapterRequest request = new AdapterRequest(xml);
  QbosAdapter adapter = new QbosAdapter();
  adapter.setQtpInstance(qtpThing);
  AdapterResponse adapterResponse = adapter.performAction(request);
  assertNotNull(adapterResponse);
  verify(qtpThing, times(1)).logIn("", "blah", "blah");
  assertEquals("FAILURE", adapterResponse.getData().getText());
}

当然,其优点在于,我的测试用例无需依赖第三方系统(在本例中为Bar)即可有效地测试适配器代码。 这自然是一种久经考验的测试技术,可在任何语言中使用,值得一试的模拟框架!

如果您发现自己用Java编写了一些集成代码,那么我不推荐Mockito。 Mockito的API非常简单,使测试易于理解。 我的意思是,它使测试易于吸收。 数字?

参考: The Disco Blog博客中的JCG合作伙伴 Andrew Glover 吸取了Mockito的流畅性

翻译自: https://www.javacodegeeks.com/2013/08/imbibing-the-fluency-of-mockito.html

mockito

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值