在我们所有的项目中,我们使用的数据类根据定义包含数据(字段),但不包含(业务)逻辑。

根据最佳编码实践,数据类最好应该是不可变的,因为不可变性意味着线程安全。 这里的主要参考是Joshua Bloch的Effective Java书籍; Yegor Bugayenko的帖子也很有趣。

不可变类具有几个有趣的属性:

  • 它不能是子类的(即它应该是最终的,或者应该具有静态工厂方法和私有构造函数)
  • 所有字段均应为私有字段(以防止直接访问)
  • 所有字段应写入一次(在实例创建时)(即,它们应该是最终值且没有设置方法)
  • 所有可变类型(例如java.util.Date)字段都应受到保护,以防止客户端通过引用进行写访问

不变类的示例如下:

public final class ImmutableBean {private final String aStr;private final int anInt;public ImmutableBean(String aStr, int anInt) {this.aStr = aStr;this.anInt = anInt;}public String getAStr() {return aStr;}public int getAnInt() {return anInt;}}

注意:在Java中很常见,有很多样板代码隐藏了不变性定义。

像Project Lombok这样的库使我们的生活更轻松,因为我们可以使用@Value批注轻松地定义一个不可变的类,如下所示:

@Valuepublic class LombokImmutableBean {String aStr;int anInt;}

更具可读性。

我们(单元)应该测试一个类以检查其不变性吗?

在理想世界中,答案是否定的。

借助我们首选的IDE自动代码生成功能或Lombok之类的库,为类添加不变性并不难。

但是在现实世界中,当我们创建类或稍后(或可能是团队的初级成员)修改类时,可能会发生人为错误。 如果不使用final来添加新字段并且使用IDE代码生成器生成了setter会怎样? 该类不再是不变的。

重要的是要确保该类在整个项目生命周期中都是并且保持不变。

借助Mutability Detector,我们可以轻松创建一个测试来检查类的不变性状态。

像往常一样,可以在Maven Central上找到Maven / Gradle依赖项。

为了测试我们的ImmutableBean,我们可以创建以下jUnit测试类:

import static org.mutabilitydetector.unittesting.MutabilityAssert.assertImmutable;public class ImmutableBeanTest {@Testpublic void testClassIsImmutable() {assertImmutable(ImmutableBean.class);}}

如果类不是不可变的,则测试将失败。

例如,如果一个字段不是final且具有setter方法,则测试将失败,并且错误消息的描述性非常强:

org.mutabilitydetector.unittesting.MutabilityAssertionError:
Expected: it.gualtierotesta.testsolutions.general.beans.ImmutableBean to be IMMUTABLEbut: it.gualtierotesta.testsolutions.general.beans.ImmutableBean is actually NOT_IMMUTABLE
Reasons:Field is not final, if shared across threads the Java Memory Model will not guarantee it is initialised before it is read. [Field: aStr, Class: it.gualtierotesta.testsolutions.general.beans.ImmutableBean]Field [aStr] can be reassigned within method [setaStr] [Field: aStr, Class: it.gualtierotesta.testsolutions.general.beans.ImmutableBean]

完整的项目可以在我在GitHub上的Test Solutions画廊项目中找到。 参见模块常规

我建议的方法是使用Lombok,而不进行任何不变性测试。 如果不能使用Lombok(例如在旧项目中),请使用“可变性检测器”声明该类确实是不可变的。

翻译自: https://www.javacodegeeks.com/2017/01/unit-testing-java-data-classes-immutability-mutability-detector.html

使用Mutability Detector对Java数据类的不变性进行单元测试相关推荐

  1. 记录更新(Java数据类)

    最近几个月,有一些与" Java数据类"(又称为"记录")有关的更新. 正如我在" JavaFX,Valhalla,数据类和Java的浮点更新 &qu ...

  2. 总结java数据类型和mysql、oracle、pgsql数据类型对应关系,附数据库字段类型转java类型代码

    java的基本数据类型有八种: byte.short.int.long.float.double.char.boolean 总结java和mysql.oracle.pgsql数据类型对应关系 java ...

  3. Java数据类型和MySql数据类型对应表

    java mysql 数据类型对照 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述 VARCHAR L+N VARCHAR java.lang.String 12 CH ...

  4. 与Brian Goetz聊Java的数据类

    \ 看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料! \ \\ 作为Oracle的Java语言架构师,Brian Goetz一直致力于Java编程语言在生产 ...

  5. java中的输入流类,Java数据输入流类

    Java DataInputStream类 数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型. 下面的构造方法用来创建数据输入流对象. DataInputStream ...

  6. java 常用类 - 大数据运算

    java 常用类 - 大数据运算 在 Java中提供了用于大数字运算的类,即 java.math.BigInteger 类和 java.math.BigDecimal 类.这两个类用于高精度计算,其中 ...

  7. java爬取网页数据_利用Python做数据分析—对前程无忧数据类岗位进行分析

    引言 随着时代的发展,我国在各行各业都需要大量的人才引进,处于近几年最热门的行业也称"最火行业":大数据.数据分析.数据挖掘.机器学习.人工智能,这五门行业各有不同又互有穿插.近几 ...

  8. Java笔试题——2的100次方,不用大数据类(Biginteger)来解答

    Java笔试题--2的100次方,不用大数据类(Biginteger)来解答 package cn.hncu.offer; public class Two100 { public static vo ...

  9. 干货:排名前 16 的 Java 工具类!

    2019独角兽企业重金招聘Python工程师标准>>> 干货:排名前 16 的 Java 工具类!   在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最 ...

最新文章

  1. 手机qq2008触屏版_比微信老却是00后最爱 手机QQ 16年进化史
  2. Class类 获取Class对象
  3. VC 2010下安装OpenCV2.4.4
  4. C++语言类的多态介绍和示例
  5. 信号与系统——初识到理解(第一章 ——概述)
  6. 淘宝天猫京东商品详情一键铺货到拼多多平台店铺接口代码对接教程
  7. java 调用kettle ktr_java调用kettle数据库类型资源库中的ktr
  8. PHPAdmin删除外键约束
  9. U盘中毒了怎么恢复文件?教你正确解决方法
  10. AMD首款5纳米PC处理器锐龙7000亮相,频率首破5GHz大关,单核性能提升15%
  11. Photoshop制作WiFi图标
  12. mysql数据库特别大怎么备份_如何备份还原mysql数据库 mysql数据库太大备份与还原方法...
  13. dump文件调试技巧(产生Dump文件)
  14. IPv4下,划分子网,构造超网(CIDR)
  15. 以EV录屏为例详细讲解-录屏,开直播的全局配置
  16. python在Scikit-learn中用决策树和随机森林预测NBA获胜者
  17. oracle.net.ns.NetException:Socket read timed out update
  18. Django框架——模型层单表操作、模型层多表操作、模型层常用和非常用字段和参数、模型层进阶
  19. 五金手册_五金反引号
  20. IE安装HttpWatch使用教程HttpWatch协议抓取包不显示解决办法

热门文章

  1. 分布式 | Dubbo 架构设计详解
  2. JTA 深度历险 - 原理与实现
  3. java Date获取 年月日时分秒
  4. Java中的函数传递
  5. jdk和cglib简单理解
  6. Oracle入门(十三A)之Select
  7. Jodd - Java界的瑞士军刀轻量级工具包
  8. laravel允许所有网站进行跨域操作
  9. selenium以及chromdrive安装
  10. 人脸登陆facelogin