1.1 Mockito 库
今天我们将熟悉高级测试。更具体地说,使用Mockito库。甚至不要考虑离开这个行业。
首先,这个库是Spring测试中的一个标准。这实际上是 Java 后端开发行业的标准。
其次,您必须为 Spring 代码编写测试。了解您编写的后端是否正常工作的唯一方法是调用其 API 的方法。进行测试比不进行测试要容易 10 倍。你会亲眼看到的。
pom.xml
您可以使用以下代码将 Mockito 库添加到您的库中:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>
1.2 模拟对象
那么这个 Mockito 是什么,为什么这么好?
在开发和开发测试的过程中,经常需要将某种“存根”而不是真实对象插入代码中。
例如,与数据库一起工作的代码经过测试并在那里进行了一些更改。最好在每次测试之前该数据库的状态相同(否则测试将不同)。我希望基础更简单,以便快速回滚这些状态。
或者,例如,您正在测试发送有用 SMS 的代码。对于直邮,他使用某种付费短信网关。最好将一些虚拟网关放入其中以测试代码,以免向无法理解的人发送数百条 SMS。
或者您的代码正在从其他 Web 服务器请求数据,而这些数据在测试服务器上根本不可用。或者你写了一个在线支付的代码,需要测试50次,然后才允许在真正的金融渠道中使用。
我想你明白了...... 虚拟对象,或者因为它们也被称为存根对象,是一个非常有用的东西。
困难来了——Java 有静态类型。这意味着为了将对ReadDatabase
对象的引用分配给变量而不是 类型的对象,您需要从VirtualDatabase
继承类。VirtualDatabase
RealDatabase
然后发现这个类有RealDatabase
一堆私有的方法和变量存储了对其他真实对象的引用,你不能这样写一个普通的存根。理论上是好的,但实际上是死胡同。
Java 5 中出现了救援(您可以阅读DynamicProxy
更多详细信息)。它允许您创建编译器没有任何抱怨的虚拟对象。
此类虚拟对象称为模拟(来自模拟一词 - 布局)。Mockito 库能够将这些模拟的工作提升到前所未有的高度。因此,顺便说一句,图书馆的名字。
1.3 @ExtendWith 注解
Mockito 库与 JUnit 配合得很好,它甚至可以被认为是它的扩展。
有两种方法可以在单元测试中启用 Mockito 库。第一种方式是添加一个特殊的注解:
@ExtendWith(MockitoExtension.class)
public class MockitoAnnotationTest {
...
}
第二种方法是通过调用方法启用它的工作openMocks()
:
public class MockitoAnnotationTest {
@BeforeEach
public void init() {
MockitoAnnotations.openMocks(this);
}
}
大多数情况下,您会看到第一个选项,但有时知道还有第二个选项会很有用。
GO TO FULL VERSION