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

根据最佳编码实践,数据类最好应该是不可变的,因为不可变性意味着线程安全。 这里的主要参考是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. 电流如何在导线中传播
  2. app怎么嵌套vue页面_PHP抖音点赞APP【开发】HTML5
  3. CodeForces 407C
  4. 更新丨.NET 7 预览版2 中的 ASP.NET Core
  5. mysql中like % %模糊查询
  6. c++扫雷游戏代码_C语言学习教程,用C语言编写扫雷游戏
  7. 看图说话,FastJson 并没有那么流行!
  8. el-table 懒加载不触发合计_Angular-懒加载第三方
  9. nlp中region_百度5年深耕NLP 他把聊天机器人变成你的“全科医生”
  10. libfetion的使用
  11. Intel ICH9 sata驱动
  12. STM32中GPIO工作原理详解
  13. 攻防世界:logmein
  14. 在线预览文档 Office Online
  15. 在 tsx 中使用 react 的 ref 属性
  16. 移动端-K线图-开发
  17. 编译c或c++代码出现error “***” was not declared in this scope 的解决方法
  18. 【商业分析 01】商业分析网站汇总
  19. Abaqus线性动态分析之模态与响应谱分析(附INP文件)
  20. 提取图中数据的神器→→→plot_digitizer

热门文章

  1. Redis 的 8 大应用场景
  2. 教你用 3 台机器搞定一个 Redis 高可用架构
  3. EL调用java方法
  4. 漫画:什么是SnowFlake算法
  5. Redis入门(一)之安装
  6. Python解决中文乱码问题
  7. Hibernate中使用Criteria查询及注解——(HibernateUtil)
  8. 奇技淫巧:在spring官网上下载历史版本的spring插件,springsource-tool-suite
  9. 二叉堆的操作总结(insert+deleteMin+increaseKey+decreaseKey+percolateDown+percolateUp)
  10. cassandra 备份_使用sstableloader恢复Cassandra Priam备份