政务公开 加强门户网站建设企业网站建设变相收取等级保护费6
web/
2025/10/7 10:57:52/
文章来源:
政务公开 加强门户网站建设,企业网站建设变相收取等级保护费6,jinsom wordpress,百度地图推广mockito入门本文是我们名为“ 用Mockito测试 ”的学院课程的一部分。 在本课程中#xff0c;您将深入了解Mockito的魔力。 您将了解有关“模拟”#xff0c;“间谍”和“部分模拟”的信息#xff0c;以及它们相应的存根行为。 您还将看到使用测试双打和对象匹配器进行验证的… mockito入门 本文是我们名为“ 用Mockito测试 ”的学院课程的一部分。 在本课程中您将深入了解Mockito的魔力。 您将了解有关“模拟”“间谍”和“部分模拟”的信息以及它们相应的存根行为。 您还将看到使用测试双打和对象匹配器进行验证的过程。 最后讨论了使用Mockito的测试驱动开发TDD以了解该库如何适合TDD的概念。 在这里查看 目录 1.为什么要模拟 2. Mockito框架简介 2.1。 存根的快速示例 2.2。 快速验证示例 3.混合一个Mockito 4.将Mockito与JUnit一起使用 5. Mockito最佳做法 在本教程中我们将研究Mockito Mocking Framework并通过将其添加到类路径中来准备一个Eclipse项目来使用它。 1.为什么要模拟 我们编写的所有代码都有一个相互依赖的网络它可以调用其他几个类的方法而这些类又可以调用其他方法。 确实这就是面向对象编程的意图和力量。 通常在编写功能代码的同时我们还将以自动化单元测试的形式编写测试代码。 我们使用这些单元测试来验证代码的行为以确保其行为符合我们的预期。 当我们对代码进行单元测试时我们希望对其进行隔离测试并希望对其进行快速测试。 为了进行单元测试我们只关心在当前测试的类中验证自己的代码。 通常我们还希望非常定期地执行单元测试重构时以及在持续集成环境中工作时每小时可能要执行多次。 这是我们所有相互依存成为问题的时候。 我们可能最终在另一个类中执行代码该类中的错误导致导致单元测试失败。 想象一下我们用来从数据库中读取用户详细信息的类如果要运行单元测试时没有数据库会发生什么 想象一下一个调用多个远程Web服务的类如果它们出现故障或需要很长时间响应怎么办 我们的单元测试可能由于我们的依赖关系而失败而不是因为我们的代码行为出现问题。 这是不希望的。 除此之外强制执行想要确保代码正确处理的特定事件或错误条件可能非常困难。 如果我们要测试某个反序列化对象的类如何正确处理可能的ObjectStreamException怎么办 如果我们要测试协作者的所有边界返回值怎么办 确保将某些计算值正确传递给协作者该怎么办 如果可能的话复制我们的测试条件可能需要花费大量的代码和较长的时间。 如果使用模拟所有这些问题都会消失。 嘲笑就像是我们与之合作的类的替代品一样它们取代了他们的位置并按照我们告诉他们的行为去做。 嘲弄让我们假装我们真正的合作者在那里即使他们不在。 更重要的是可以对模拟程序进行编程以返回我们想要的任何值并确认将任何值传递给它们。 模拟程序立即执行不需要任何外部资源。 假人会返回我们告诉他们的东西抛出我们想让他们抛出的任何异常并将按需一遍又一遍地执行这些操作。 他们让我们仅测试我们自己代码的行为以确保我们的类能够正常工作而不管其协作者的行为如何。 有几种可用于Java的模拟框架每种都有各自的语法各自的优势各自的劣势。 在本教程中我们将使用Mockito框架它是最流行的可用模拟框架之一。 2. Mockito框架简介 Mockito是一个Mocking框架可以很容易地为要与您的被测类进行交互的类和接口创建模拟。 Mockito提供了一个非常简单的API用于创建模拟并分配其行为。 它使您可以非常快速地指定预期的行为并验证与模拟的交互。 Mockito本质上具有两个阶段其中一个或两个阶段都作为单元测试的一部分执行 存根 验证 存根是指定模拟行为的过程。 这就是我们告诉Mockito与模拟互动时想要发生的事情的方式。 存根使我们能够解决我们在第一部分中概述的一些问题–它使为测试创建所有可能的条件变得简单。 它让我们控制了模拟的响应包括强迫它们返回我们想要的任何值或者抛出我们想要的任何异常。 它使我们可以在不同条件下编写不同的行为。 存根使我们可以精确控制模拟将执行的操作。 验证是验证与我们的模拟互动的过程。 它使我们能够确定模拟的调用方式以及调用的次数。 它使我们可以查看模拟的参数以确保它们符合预期。 验证使我们能够解决第一节中提到的其他问题–它使我们确保将我们期望的值准确地传递给我们的合作者并且不会发生意外情况。 验证使我们能够准确确定模拟发生了什么。 通过将这两个简单的阶段联系在一起我们可以构建极其灵活且功能强大的单元测试使用非常简单的Mockito API编码复杂的模拟行为和复杂的模拟交互验证。 Mockito确实有一些限制包括 你不能嘲笑期末班 您不能模拟静态方法 您不能模拟最终方法 您不能模拟equals或hashCode 存根的快速示例 想象一下您正在编写一个调用物理温度传感器API的类。 您要调用double getDegreesC()方法并基于从传感器返回的值返回以下字符串之一“ Hot”“ Mild”“ Cold”。 至少可以说要使单元测试控制房间的环境温度以测试功能非常困难。 但是如果我们使用Mockito来创建替代传感器的模拟物该怎么办 现在我们可以在单元测试中编写如下代码 when(sensor.getDegreesC()).thenReturn(15.0); 这告诉Mockito当模拟传感器收到对getDegreesC()的调用时它应该然后返回值15.0。 快速验证示例 假设您有一个类进行一些计算并负责在观察者完成计算后通知观察者。 您想确保在执行方法的过程中一次调用了观察者的notify()方法。 您可以在观察器中设置一些布尔值然后从单元测试中进行检查但这意味着更改一些生产代码甚至您可能都不拥有这些代码。 Mockito怎么样如果观察者是模拟的呢 现在我们可以在单元测试中编写如下代码 verify(observer).notify(); 这告诉Mockito必须仅一次调用一次notify()方法否则单元测试应该失败。 3.混合一个Mockito 现在我们已经了解了一些有关框架的知识让我们在项目中使用它。 如果使用Maven则将Mockito添加到项目中就像添加以下依赖项一样简单 dependency
groupIdorg.mockito/groupId
artifactIdmockito-all/artifactIdversion1.9.5/versionscopetest/scope/dependency 如果您使用Gradle则只需添加以下内容 dependencies {testCompile org.mockito:mockito-all:1.9.5
} 要将旧版Mockito添加到Eclipse项目的类路径中请从Mockito下载页面中获取最新的jar 取名为 mockito-all-1.9.5.jar并将其下载到硬盘上。 右键单击您的eclipse项目然后选择“属性”然后在左窗格中选择“ Java Build Path”然后在右侧选择“ Libraries”。 在“库”选项卡上单击“添加外部Jar”按钮然后导航到您先前下载的模拟所有jar。 选择罐子它现在已添加到您的项目中并可供使用。 在撰写本文时Mockito的最新版本是1.9.5但是在将其添加到项目之前应检查更新。 4.将Mockito与JUnit一起使用 要将Mockito集成到您的JUnit测试类中可以使用提供的Test Runner MockitoJUnitRunner 。 只需使用以下注释您的测试课 RunWith(MockitoJUnitRunner.class) 这告诉Mockito在测试类中接受所有带注释的模拟并对其进行初始化以进行模拟。 然后您可以简单地使用Mock注释任何实例变量以将其用作模拟。 请注意您应该导入org.mockito.Mock而不是org.mockito.mockitoannotations.Mock 已弃用。 与所有示例一样我们将创建一个新的Test类并在其中使用Mockito模拟java.util.List import java.util.List;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;RunWith(MockitoJUnitRunner.class)
public class MyTest {Mockprivate ListString mockList;} Mock注释告诉Mockito模拟mockList将被视为模拟而RunWith(MockitoJUnitRunner.class)告诉Mockito遍历MyTest所有带有Mock注释的成员并将其初始化以进行模拟。 您不必将任何新实例分配给嘲笑列表这是由Mockito在后台完成的。 通过上面的简单代码mockList准备好用作模拟了。 尝试添加以下导入 import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import org.junit.Test; 然后是以下简单的测试用例 Testpublic void test() {String expected Hello, World!;when(mockList.get(0)).thenReturn(expected);String actual mockList.get(0);assertEquals(expected, actual);System.out.println(actual);} 在这里我们看到了我们的期望-我们有一个字符串Hello, World! 然后继续对模拟列表的List.get()方法进行存根 List.get()在请求列表的第一个元素时返回期望的String。 然后我们调用mockList.get(0)以获取测试的实际值并断言我们的实际值等于我们的预期值然后将其输出到控制台以进行良好测量。 我们根本没有创建真实列表也没有插入“ HelloWorld” 进入列表。 它只是一个模拟列表它具有或知道的唯一功能是输入为0的get方法。 尝试更改String actual mockList.get(0); 到String actual mockList.get(1); 并运行测试。 您将看到actual值现在为空。 原因是我们唯一保留的功能是使用输入0调用.get– Mockito不知道如何使用输入1进行操作因此它仅返回null。 实际上我们调用List的任何其他方法都将返回null而任何不返回任何值的方法将有效地充当no-op。 这是一个功能强大的控件在几行代码中我们创建了List的实现该实现恰好在每次调用它时都可以实现我们想要的功能。 5. Mockito最佳做法 Mockito通常鼓励在单元测试和设计中采用标准的最佳实践即 Mockito没有模拟静态方法的规定因为Mockito鼓励面向对象的设计和对过程代码的依赖注入。 Mockito没有提供模拟私有方法的规定因为公共方法应该是黑盒并且从测试私有方法的角度来看不存在。 Mockito打包并鼓励使用Hamcrest Matchers这将在后续教程中介绍。 Mockito鼓励遵守Demeter法则而不鼓励嘲笑链式方法。 您不应存根或验证在不同线程之间共享的模拟。 但是您可以调用共享模拟的方法。 您无法验证模拟的toString()方法原因是测试环境本身可能会调用它因此无法进行验证。 如果您的测试用例使用了“当时给定”表示法则可以使用org.mockito.BDDMockito的存根方法以便when(mock.method()).thenReturn(something)成为given(mock.method()).willReturn(something)因为它将以您的测试格式很好地阅读。 可以在不使用Mockito批注的情况下使用Mockito但是使用批注更加容易和整洁这就是我们在这些教程中将要做的。 如果您的测试要求您出于测试目的修改类的特定方法的行为则可以“监视”任何类包括被测类。 Mockito明确建议仅在偶尔使用间谍的情况下使用间谍例如在处理遗留代码的情况下。 这将在以后的教程中介绍。 如果对间谍方法的实际调用可能会产生错误条件或者由于某些其他原因而无法调用则Mockito建议使用do *系列方法进行存根。 这将在以后的教程中介绍。 Mockito将允许您使用参数匹配器代替实际参数但有一个限制如果一个参数使用匹配器则所有参数都必须使用匹配器。 参数匹配器将在以后的教程中介绍但应谨慎使用。 Mockito提供了verifyNoMoreInteractions()方法来验证特定的模拟没有更多的交互但建议仅在适当的情况下谨慎使用。 Mockito提供了Answer接口以允许使用回调进行存根但建议不要使用它并鼓励您使用thenReturn()和doThrow()方法进行简单的存根。 我们将在以后的教程中介绍答案。 如果使用ArgumentCaptor进行参数验证则应仅在验证阶段而不是存根阶段使用它。 ArgumentCaptor将在以后的教程中介绍。 Mockito建议非常小心地使用Partial Mocks主要是在处理遗留代码时。 设计良好的代码不应要求使用部分模拟。 Mockito提供了一个reset()方法用于在测试方法的中间重置模拟但是建议您不要使用它因为它是一种代码气味可能会使您的测试过长且过于复杂。 有更多的功能和做法但是这些是Mockito告诉您要注意的主要功能和做法。 我们将在接下来的教程中介绍以上所有内容并进行更深入的介绍。 翻译自: https://www.javacodegeeks.com/2015/11/getting-started-with-mockito.htmlmockito入门
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88435.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!