固定时钟是使用`java.time.Clock`类及其静态方法`fixed()`创建的,该方法以`java.time.Instant`和`java.time.ZoneId`为例。`java.time.Instant`的实例是在 epoch 之后使用一些静态秒数构建的。`java.time.Clock`用于表示一个时钟,新的日期/时间 API 可以使用该时钟来确定当前时间。如前所述,时钟可以固定,然后我们可以在亚洲/加尔各答时区创建一个比当前系统时间提前一小时的时钟,如下所示:
固定时钟是使用`java.time.Clock`类及其静态方法`fixed()`创建的,该方法以`java.time.Instant`和`java.time.ZoneId`为例。`java.time.Instant`的实例是在纪元之后使用一些静态秒数构建的。`java.time.Clock`用于表示一个时钟,新的日期/时间 API 可以使用该时钟来确定当前时间。如前所述,时钟可以固定,然后我们可以在亚洲/加尔各答时区创建一个比当前系统时间提前一小时的时钟,如下所示:
本章介绍如何测试应用程序如何捕获和自动测试用例,如何在 API 与其他组件集成之前对其进行单元测试,以及如何集成所有单元。我们将向您介绍**行为驱动开发**(**BDD**),并展示它如何成为您应用程序开发的起点。我们还将演示 JUnit 框架如何用于单元测试。有时,在单元测试期间,我们必须使用一些虚拟数据来插桩依赖项,这可以通过模拟依赖项来完成。我们将向您展示如何使用模拟库来实现这一点。我们还将向您展示如何编写夹具来填充测试数据,以及如何通过集成不同的 API 并将它们测试在一起来测试应用程序的行为。我们将介绍以下配方:
本章介绍如何测试应用程序如何捕获和自动测试用例,如何在 API 与其他组件集成之前对其进行单元测试,以及如何集成所有单元。我们将向您介绍**行为驱动开发**(**BDD**),并展示它如何成为您应用程序开发的起点。我们还将演示 JUnit 框架如何用于单元测试。有时,在单元测试期间,我们必须使用一些虚拟数据来插桩依赖项,这可以通过模拟依赖项来完成。我们将向您展示如何使用模拟库来实现这一点。我们还将向您展示如何编写夹具来填充测试数据,以及如何通过集成不同的 API 并将它们测试在一起来测试应用程序的行为。我们将介绍以下配方:
一旦我们定义了要测试的功能,我们就需要所谓的*步骤定义*,它允许将纯文本小黄瓜翻译成实际执行 SUT 的动作。在 Java 中,可以很容易地通过注释对步骤实现的方法进行注释:`@Given`、`@Then`、`@When`、`@And`和`@But`。每个步骤的字符串值可以包含正则表达式,这些正则表达式在方法中映射为字段。请参见下一节中的示例。
一旦我们定义了要测试的功能,我们就需要所谓的*步骤定义*,它允许将纯文本Cucumber翻译成实际执行 SUT 的动作。在 Java 中,可以很容易地通过注释对步骤实现的方法进行注释:`@Given`、`@Then`、`@When`、`@And`和`@But`。每个步骤的字符串值可以包含正则表达式,这些正则表达式在方法中映射为字段。请参见下一节中的示例。
考虑下面的例子。这个测试类使用`@Docker`注释来启动 MySql 容器(容器图像 MySql)和每个测试的开始。内部集装箱端口为`3306`,将映射到主机端口`8801`。然后,定义了几个环境属性(MySql 根密码、默认数据库以及用户名和密码)。直到容器日志中出现跟踪`mysqld:ready for connections`(表示 MySql 实例已启动并正在运行)后,测试才会开始执行。在测试主体中,我们针对容器中运行的 MySQL 实例启动 JDBC 连接。
考虑下面的例子。这个测试类使用`@Docker`注释来启动 MySql 容器(容器图像 MySql)和每个测试的开始。内部集装箱端口为`3306`,将映射到主机端口`8801`。然后,定义了几个环境属性(MySql 根密码、默认数据库以及用户名和密码)。直到容器日志中出现跟踪`mysqld:ready for connections`(表示 MySql 实例已启动并正在运行)后,测试才会开始执行。在测试主体中,我们针对容器中运行的 MySQL 实例启动 JDBC 连接。