最佳Java单元测试框架

9,044 阅读5分钟

基本单元测试框架

- JUnit / TestNG

无论何时编写单元测试,都要执行代码然后检查其输出。您需要一个基本框架
,并用类似的方式运行大量测试。

JUnit

JUnit

是一个基本框架,您可以指定要运行的测试并且得到输入以后产生的结果。

比如:


JUnit提供了不同类型的断言方法来检查测试中执行代码的结果。具体包括

assertEquals(),assertTrue(),和assertFalse()。

再比如:


JUnit还支持参数化测试。

TestNG

相比用JUnit编写单元测试,TestNG也是一个很好的替代方案,它可以很容易地编写自定义测试。如果您拥有执行测试所需的测试数据,TestNG可以轻松获取要编写单元测试的测试数据。总之,JUnit和TestNG是使您能够编写测试和检查结果的框架。如果测试成功,您会看到一个绿色条。反之就是红色。

模拟框架- Mockito和EasyMock

在Java中比较好的模拟选项--Mockito和EasyMock。

Mockito

举个例子:


返回的值findTheGreatestFromAllData()取决于从数据服务返回的数据。为了能够为这个方法编写一个好的单元测试,你需要模拟这个依赖。

比如这个测试:


Mockito使得模拟DataService变得更加容易。在这里,我们使用它的mock()方法来模拟DataService并将模拟注入到SomeBusinessImpl类中。

Mockito还提供了很好的注释来自动注入模拟。


EasyMock

EasyMock也是一个可以有效地用于单元测试的模拟框架。它是Mockito的替代品。

模拟复杂场景-使用PowerMock

像Mockito这样的框架只允许您在代码设计良好时插入模拟。当设计不太好时,PowerMock
会为您提供帮助。

当您想要模拟静态方法、构造函数和私有方法时,Powermock非常有用。

看看下面的代码:


SomeClass.staticMethod是一个定义好的静态方法。在模拟之后我们需要测试methodCallingAStaticMethod()这个方法。看看下面的测试代码:


我们编写了代码,允许我们模拟静态方法。

也可以模拟构造函数:


调用构造函数时,将mockList返回。

PowerMock也可用于模拟私有方法:


请注意,您无法直接从测试代码调用私有方法。我们使用名为WhiteBox的类的功能,以此来传递私有方法的字符串名称。

使用AssertJ / Hamcrest编写好的断言

无论何时编写测试,都希望有很好的断言。

AssertJ

比如:


numbers是一个包含3个值的整数列表。AssertJ提供了方法assertThat(),您可以将多个断言链接在一起。assertThat()也适用于字符串,特别适用于字母文本。

Hamcrest

Hamcrest提供了AssertJ的替代方案来编写断言。


使用Spring Unit

典型应用程序有多个层,您希望为不同的层(Web,业务和数据)编写单元测试。

以下是一些推荐的选项:

· Web层- Spring MockMVC

·数据层- DataJpaTest

·业务层-基于Mockito的测试,最好不要启动Spring Context

Web层的单元测试

看看下面的代码:


此单元测试使用Spring Unit框架和Spring MockMVC框架。

Spring MockMVC框架可以轻松执行REST API请求。在上面的代码中,我们使用它来执行REST API,然后设置对结果的某些期望:

· URL是/dummy-item

·接受的内容类型是application+json

·发送请求后,检查响应状态是否为“OK”,内容是具有特定数据的JSON对象

我们也可以模拟业务服务:


当retrieveAllItems()在businessService上被调用时,它将返回显示在固定项目列表。我们再次对不同的URL执行请求,当响应进入时,内容将被验证为具有预期数据的JSON类型。

数据层的单元测试

DataJpaTest可以在基于Spring的企业应用程序中对数据层进行单元测试时使用。DataJpaTest在默认情况下,使用内存数据库进行单元测试。


断言JSON响应- JSONAssert / JSONPath

几乎所有REST API都使用JSON。你如何断言JSON内容?

使用JSONAssert

看看下面的测试代码:


actualResponse是服务返回的内容。

JSONAssert允许我们检查我们感兴趣的请求的特定部分。

·在测试jsonAssert_StrictFalse()中,我们只关心的id,name以及price,忽视了quantity。

·您也可以编写一个测试来检查有没有转义字符,比如使用jsonAssert_WithoutEscapeCharacters()。您还可以在严格模式下执行断言,在此模式中,您可以比较所有字段,并以实际格式进行比较。

使用JSONPath

断言JSON的另一种方法是JSONPath框架。您可能希望检查响应的特定方面,例如响应中的三个项目。


正如XPath用于查询XML一样,JSONPath用于查询JSON。

·表达式$.length()返回元素的数量。然后可以对该返回值使用断言。

·您可以检查所有id字段,$..id并将它们与预先固定的值列表进行比较。

·您可以提取响应中元素列表的切片,例如第一个元素($.[1])或前两个元素($.[0:2])。

·您可以查询响应以检查特定字段是否存在:$.[?(@.name == 'Eraser')]或$.[?(@.quantity == 5)]。

本人创业团队产品MadPecker,主要做BUG管理、测试管理、应用分发
网址:www.madpecker.com,有需要的朋友欢迎试用、体验!
本文为MadPecker团队产品经理译制,转载请标明出处