开发网站的经济可行性,如何做网站布局优化,中国新农村建设促进会网站,深圳十大活动策划公司mockito我最近发现自己编写了一些代码来集成两个不同的平台。 这些系统之一是基于Java的系统#xff0c;而另一个虽然不是用Java编写的#xff0c;却提供了Java API。 我将这些系统分别称为Foo和Bar。 在我编写一行代码之前就很明显了#xff0c;但是#xff0c;测试最终… mockito 我最近发现自己编写了一些代码来集成两个不同的平台。 这些系统之一是基于Java的系统而另一个虽然不是用Java编写的却提供了Java API。 我将这些系统分别称为Foo和Bar。 在我编写一行代码之前就很明显了但是测试最终的适配器将需要我显式地模拟后来的系统的API即Foo因为我所需要的只是一个jar文件其类和方法清楚了他们与一个实例进行了交流。 我花了几个周期来查看Java 模拟世界中的新功能并且很高兴看到我的老朋友Mockito仍然很活跃并且确实仍然是通用模拟的出色工具 。 对于初学者来说 Mockito是基于Java的模拟框架它可以 …味道真的很好。 它使您可以使用[a]简洁的API编写漂亮的测试。 Mockito不会给您带来麻烦因为测试的可读性很强并且会产生清晰的验证错误。 Google代码模拟项目页面 –为什么喝呢 实际上Mockito提供了一个简单流畅的API 使您可以精确地模拟行为而无需大惊小怪。 例如与Bar进行交互的主要外观是通过QTP类该类具有诸如logIn logOut等方法。与其依靠被测类实际调用这些方法我还可以像这样轻松地使用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方法签名中。 您可以通过doThrow和when方法执行此操作。 模拟出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.htmlmockito