4. 现在,我们在`mlib`目录中有两个 JAR:`math.util@1.0.jar`和`calculator@1.0.jar`。这些 JAR 被称为模块化 JAR。如果要运行该示例,可以使用以下命令:
```java
java-pmlib-mcalculator
...
...
@@ -694,7 +694,7 @@ math.util@1.0
# 在项目前 JigsawJDK 应用程序中使用模块 JAR
如果我们的模块化 JAR 能够与项目前的 JigsawJDK 应用程序一起运行,那将是一件令人惊讶的事情。这样,我们就不用为 JDK 9 之前的应用程序编写另一个版本的 API 了。好消息是,我们可以像使用普通JAR一样使用模块化JAR,也就是说,JAR的根部没有`module-info.class`。我们将在这个食谱中看到如何做到这一点。
如果我们的模块化 JAR 能够与项目前的 JigsawJDK 应用程序一起运行,那将是一件令人惊讶的事情。这样,我们就不用为 JDK 9 之前的应用程序编写另一个版本的 API 了。好消息是,我们可以像使用普通 JAR 一样使用模块化 JAR,也就是说,JAR 的根部没有`module-info.class`。我们将在这个食谱中看到如何做到这一点。
我们无法对`calculator.jar`进行模块化,因为它依赖于另一个非模块化代码`jackson-databind`,我们无法对`jackson-databind`进行模块化,因为它不是由我们维护的。这意味着我们无法实现应用程序的 100% 模块化。在本配方的开头,我们向您介绍了未命名的模块。我们在类路径中的所有非模块代码都分组在未命名的模块中,这意味着所有与 Jackson 相关的代码仍然可以保留在未命名的模块中,我们可以尝试模块化`calculator.jar`。但是我们不能这样做,因为`calculator.jar`不能声明对`jackson-databind-2.8.4.jar`的依赖关系(因为它是一个未命名的模块,命名的模块不能声明对未命名模块的依赖关系)。
解决这个问题的一种方法是将与 Jackson 相关的代码作为自动模块。我们可以通过移动与 Jackson 相关的JAR来实现这一点:
解决这个问题的一种方法是将与 Jackson 相关的代码作为自动模块。我们可以通过移动与 Jackson 相关的 JAR 来实现这一点:
*`jackson-databind-2.8.4.jar`
*`jackson-annotations-2.8.4.jar`
...
...
@@ -1731,7 +1731,7 @@ com/packt/CollectionsDemo has been compiled by a more recent version of the Java
[这里](https://dev.mysql.com/downloads/windows/installer/5.7.html)下载的捆绑的安装程序仅适用于 Windows。 Linux 用户必须分别下载 MySQL Server 和 MySQL Workbench(用于与 DB 交互的 GUI)。MySQL服务器可以从[这里](https://dev.mysql.com/downloads/mysql/)下载。MySQL Workbench 可以从[这里](https://dev.mysql.com/downloads/workbench/)下载。
[这里](https://dev.mysql.com/downloads/windows/installer/5.7.html)下载的捆绑的安装程序仅适用于 Windows。 Linux 用户必须分别下载 MySQL Server 和 MySQL Workbench(用于与 DB 交互的 GUI)。MySQL服务器可以从[这里](https://dev.mysql.com/downloads/mysql/)下载。MySQL Workbench 可以从[这里](https://dev.mysql.com/downloads/workbench/)下载。
# 创建示例数据库
...
...
@@ -175,7 +175,7 @@ insert into person(first_name, last_name, place)
本章介绍如何测试应用程序如何捕获和自动测试用例,如何在 API 与其他组件集成之前对其进行单元测试,以及如何集成所有单元。我们将向您介绍**行为驱动开发**(**BDD**),并展示它如何成为您应用程序开发的起点。我们还将演示 JUnit 框架如何用于单元测试。有时,在单元测试期间,我们必须使用一些虚拟数据来插桩依赖项,这可以通过模拟依赖项来完成。我们将向您展示如何使用模拟库来实现这一点。我们还将向您展示如何编写夹具来填充测试数据,以及如何通过集成不同的 API 并将它们测试在一起来测试应用程序的行为。我们将介绍以下配方:
我们建议您从`Chapter16/101_student_data_processor`中提供的源代码构建`student.processor`模块化 JAR。我们提供了`build-jar.bat`和`build-jar.sh`脚本来帮助您构建 JAR。您只需运行与平台相关的脚本,然后将`101_student_data_processor/mlib`中的 JAR 构建复制到`4_bar_charts/mlib`。
这是一个非常简单的示例,其中评估了名为`MessageComponent`的 Spring 组件。当本测试开始时,我们的`ApplicationContext`启动,所有 Spring 组件都在里面。之后,在本例中,将 Bean`MessageComponent`注入测试中,只需调用方法`getMessage()`并验证其响应即可对其进行评估。
值得回顾一下此测试需要哪些依赖项。使用 Maven 时,这些依赖项如下所示:
...
...
@@ -1164,7 +1164,7 @@ class SimpleSpringBootTest {
在控制台中执行测试时,我们可以看到应用程序实际上是在测试之前启动的(请注意开头的 spring ASCII 横幅)。
之后,我们的测试使用`ApplicationContext`对一个 Spring 组件进行验证,结果测试成功:
![](img/00115.gif)
...
...
@@ -1220,7 +1220,7 @@ public class PageService {
示例项目`junit5 spring boot web`的内容
让我们继续讨论有趣的部分:测试。我们正在这个项目中实施三个 Jupiter 测试。第一个用于验证对页面`/index.html`的直接调用。如前所述,该测试需要使用Spring延长件(`@ExtendWith(SpringExtension.class)`并声明为Spring启动测试(`@SpringBootTest`。为了实现对 Web 应用程序的请求,我们使用了一个`MockMvc`实例,通过几种方式(HTTP 响应代码、内容类型和响应内容体)验证响应。此实例使用 Spring Boot 注释`@AutoConfigureMockMvc`自动配置。
让我们继续讨论有趣的部分:测试。我们正在这个项目中实施三个 Jupiter 测试。第一个用于验证对页面`/index.html`的直接调用。如前所述,该测试需要使用 Spring 延长件(`@ExtendWith(SpringExtension.class)`并声明为 Spring 启动测试(`@SpringBootTest`。为了实现对 Web 应用程序的请求,我们使用了一个`MockMvc`实例,通过几种方式(HTTP 响应代码、内容类型和响应内容体)验证响应。此实例使用 Spring Boot 注释`@AutoConfigureMockMvc`自动配置。
在 Spring Boot 之外,可以使用名为`MockMvcBuilders`的构建器类来创建对象`MockMvc`,而不是使用`@AutoConfigureMockMvc`。在本例中,应用程序上下文用作该生成器的参数。
一旦我们定义了要测试的功能,我们就需要所谓的*步骤定义*,它允许将纯文本Cucumber翻译成实际执行 SUT 的动作。在 Java 中,可以很容易地通过注释对步骤实现的方法进行注释:`@Given`、`@Then`、`@When`、`@And`和`@But`。每个步骤的字符串值可以包含正则表达式,这些正则表达式在方法中映射为字段。请参见下一节中的示例。
一旦我们定义了要测试的功能,我们就需要所谓的*步骤定义*,它允许将纯文本 Cucumber 翻译成实际执行 SUT 的动作。在 Java 中,可以很容易地通过注释对步骤实现的方法进行注释:`@Given`、`@Then`、`@When`、`@And`和`@But`。每个步骤的字符串值可以包含正则表达式,这些正则表达式在方法中映射为字段。请参见下一节中的示例。