Page tree
Skip to end of metadata
Go to start of metadata

Recently Updated


BLOG OSSEZ 博客内容更新

HoneyMoose
HoneyMoose 的清新小站
Mockito 2 参数匹配器
Mockito 通过使用 equals() 这种自然的 Java 样式来校验参数值。有时候,当需要有其他一些灵活性的时候,你可能会要求使用参数匹配(argument matchers)。 请参考下面的代码: //stubbing using built-in anyInt() argument matcher when(mockedList.get(anyInt())).thenReturn("element"); //stubbing using custom matcher (let's say isValid() returns your own matcher implementation): when(mockedList.contains(argThat(isValid()))).thenReturn("element"); //following prints "element" System.out.println(mockedList.get(999)); //you can also verify using an argument matcher verify(mockedList).get(anyInt()); //argument matchers can also be written as Java 8 Lambdas verify(mockedList).add(argThat(someString -> someString.length() > 5)); 参数匹配运行进行灵活校验或者打标。 请访问 https://static.javadoc.io/org.mockito/mockito-core/3.0.0/org/mockito/hamcrest/MockitoHamcrest.html 链接来查看更多有关自定义参数匹配器/hamcrest matchers(custom argument matchers/hamcrest matchers)的内建参数匹配器和示例。 更多有关 自定义参数匹配器(custom argument matchers)的使用,请参考 ArgumentMatcher 类的 API 文档。 在使用复杂参数匹配器的时候需要谨慎。尝试给一个干净并且简单的测试的时候,尽量选择自然的参数匹配使用的是  equals() 对比相对偶然使用  anyX() 来说。有时候可能对你的代码进行一些重构来允许  equals() 进行匹配,或者可以实现(implement)equals()方法来帮助进行测试。 同时,请阅读 Capturing arguments for further assertions (Since 1.8.0) 页面中的内容,或者参考 ArgumentCaptor 类的 API。 ArgumentCaptor 是有关参数匹配器的是特殊实现,能够为后面的对比(assertions)捕获参数变量。 参数匹配器的写法 如果你现在正在使用参数匹配器,所有参数(all arguments)都必须由 matches 提供。 下面的示例代码显示校验,但是一些将会应用到打标中。 verify(mock).someMethod(anyInt(), anyString(), eq("third argument")); //above is correct - eq() is also an argument matcher verify(mock).someMethod(anyInt(), anyString(), "third argument"); //above is incorrect - exception will be thrown because third argument is given without an argument matcher. 像 anyObject(), eq() Matcher 方法不会返回 matchers。 在内部,他们将会在堆栈(stack)中记录一个 matcher 然后返回一个虚假的值(通常为 null)。 这种实现方式是基于 Java 编译器中有关静态类型的安全性问题而考虑的,从而带来的结果是你不能在 verified/stubbed 方法外部使用 anyObject(), eq()。   https://www.cwiki.us/display/MockitoZH/Argument+matchers
Mockito 2 关于打标(stubbing)
请参考下面有关于打标的代码。 //You can mock concrete classes, not just interfaces LinkedList mockedList = mock(LinkedList.class); //stubbing when(mockedList.get(0)).thenReturn("first"); when(mockedList.get(1)).thenThrow(new RuntimeException()); //following prints "first" System.out.println(mockedList.get(0)); //following throws runtime exception System.out.println(mockedList.get(1)); //following prints "null" because get(999) was not stubbed System.out.println(mockedList.get(999)); //Although it is possible to verify a stubbed invocation, usually it's just redundant //If your code cares what get(0) returns, then something else breaks (often even before verify() gets executed). //If your code doesn't care what get(0) returns, then it should not be stubbed. verify(mockedList).get(0); 在默认情况下,所有的方法都会有一个返回值。mock 函数默认返回的是 null,一个空的集合或者一个被对象类型包装的内置类型。例如,针对 int/Integer 将会返回 0,针对 boolean/Boolean 将会返回 false。 打标(Stubbing)可以被重写:例如一个通用的打标可以在启动的时候被确定(fixture),但是测试方法可以对其进行重写(override)。请注意重写的打标可能会在有很多标记的时候存在潜在的问题。 一旦被打标,方法将会总是返回已标记的内容,这个与这个方法被调用多少次无关。 最后的标记非常重要——当你对有相同参数的方法进行多次标记的时候。换句话说就是:标记的顺序是有关的(the order of stubbing matters),但是这个意义并不是很大。例如,这个只在标记完全相同的方法或者有时候参数匹配(argument matchers)被启用的时候,等情况下才会出现。, etc. 测试代码请访问 GitHub https://github.com/cwiki-us-demo/mockito-demo-java/blob/master/src/test/java/com/ossez/demo/mockito/MockitoStubbingTest.java 请注意,上面的测试代码在运行的时候回出现错误。 这是因为在测试代码运行的时候,我们尝试输出 mockedList.get(1),这个在测试的时候,因为我们打标为抛出异常,所以这一句话将会在测试代码中抛出异常。 运行时候,抛出异常的界面如下:   https://www.cwiki.us/pages/viewpage.action?pageId=47843418
Mockito 2 让我们校验一些行为
在下面的示例中,我们将会模拟(Mock)一个 List 列表。 这是因为绝大部分的人对列表这个接口比较熟悉(例如 add(), get(), clear() 方法)。 在实际情况中,请不要 mock list 这个类,你可用使用实际的实例来代替。 //Let's import Mockito statically so that the code looks clearer  import static org.mockito.Mockito.*;  //mock creation  List mockedList = mock(List.class);  //using mock object  mockedList.add("one");  mockedList.clear();  //verification  verify(mockedList).add("one");  verify(mockedList).clear(); 一旦创建完成后,mock 将会记住所有的交互。你可用选择校验任何你感兴趣的交互。 测试代码请访问 GitHub https://github.com/cwiki-us-demo/mockito-demo-java/blob/master/src/test/java/com/ossez/demo/mockito/MockitoBehaviourTest.java https://www.cwiki.us/pages/viewpage.action?pageId=47843416
整合到 Mockito 2
为了能够持续改进 Mockito 和在未来提升测试体验,我们希望你能够升级到 Mockito 2.10!Mockito 按照语义化版本(semantic versioning)的方式对版本进行编排,并且只在主版本升级的时候包含有重大的修改。 在库的生命周期中,有时候重大升级是必要的,通常在重大升级中包含有很多重要的新特性,对老的库进行修改甚至有可能会修改 API。 有关完整的指南和一些不兼容的修改,请参考 What’s new in Mockito 2 Wiki 页面中的内容。 我们希望能够享受  Mockito 2 带来的改进和便利。 Mockito Android 支持 在 Mockito version 2.6.1 中,我们原生包含 Android 支持(Android support)。 为了能够使用 Android 支持,添加 mockito-android 库到你项目的依赖中。这个 artifact 是 Mockito 项目组开发的,可以使用下面的的语法将依赖导入到你  Android 的项目中。 repositories { jcenter() } dependencies { testCompile "org.mockito:mockito-core:+" androidTestCompile "org.mockito:mockito-android:+" } 你可以通过在你的 testCompile scope 中使用 mockito-core 在常规虚拟机(VM)中运行相同的单元测试. 请注意,因为 Android 虚拟机的限制,你不能在 Android 中使用 inline mock maker。如果你在 Android 的测试中持续遇到问题,请访问官方的创建问题:https://github.com/mockito/mockito/issues/new 链接来向官方报告你遇到的问题。在向官方提交 Android 测试遇到的问题的时候,请同事提供你当前使用 Android 的版本和你项目中使用的依赖。 无配置 inline mock making 从版本 2.7.6 开始,我们提供了 mockito-inline 库。在这个库中,你可用不需要配置 MockMaker 扩展文件来启用 inline mock making 。 为了使用这个功能,请添加 mockito-inline 库来替换掉 mockito-core。 请参考下面的代码: repositories { jcenter() } dependencies { testCompile "org.mockito:mockito-inline:+" } 请注意,当 inline mock making 特性被默认整合到 mock maker 中的时候,这个库有可能会被取消。 有关更多的内容,请参考:Mocking final types, enums and final methods (Since 2.1.0) 页面中的内容。 https://www.cwiki.us/display/MockitoZH/Migrating+to+Mockito+2
Hibernate 5 Maven 仓库的 Artifacts
Hibernate artifacts 官方发布的仓库在 JBoss Maven repository 中。Hibernate 发布的 artifacts 也会同时同步到 Maven Central 仓库中,这是一个自动同步进程(可能会有一些延迟)。 Hibernate 项目小组负责维护 JBoss 的 Maven 仓库,同时还有一些 WIKI 的页面,这些 Wiki 页面中包含了与 Hibernate 仓库有关的重要信息: http://community.jboss.org/docs/DOC-14900 – 有关仓库的基本信息。 http://community.jboss.org/docs/DOC-15170 – 有关设置 JBoss 仓库,以便于在 JBoss 项目中进行开发工作。 http://community.jboss.org/docs/DOC-15169 – 设置访问仓库来将 JBoss 项目为你软件的一部分。 Hibernate ORM artifacts 是发布在 org.hibernate groupId 下的。   https://www.cwiki.us/display/HIBERNATE/Obtaining+Hibernate
Hibernate 5 发行组件下载
Hibernate 项目小组提供了一系列发布组合(bundles),这些发布组合发布在 SourceForge 文件发布系统中。这些发布的包有 TGZ 和ZIP 格式。 每一个发布组合包含有 JAR 文件,文档,源代码和其他一些有用的内容。 你可以选择你需要的格式来下载 Hibernate 的发布版本,有关发布版本的列表,请参考 https://sourceforge.net/projects/hibernate/files/hibernate-orm/。发布版本的结构请参考下面的内容: lib/required/ 目录包含有 hibernate-core Jar 和所有需要的依赖。不管你需要使用 Hibernate 的何种功能,所有的这些都需要设置到你的  classpath 路径中。 lib/envers 目录包含有 hibernate-envers Jar 和需要的依赖(这些依赖,不包含在 lib/required/ 和lib/jpa/ 中)。 lib/spatial/ 目录包含有 hibernate-spatial Jar 和需要的依赖(这些依赖,不包含在 lib/required/ 和lib/jpa/ 中)。 lib/osgi/ 目录包含有 hibernate-osgi Jar 和需要的依赖(这些依赖,不包含在 lib/required/ 和lib/jpa/ 中)。 lib/jpa-metamodel-generator/ 目录包含了创建 Criteria API type-safe 元模型(Metamodel)所需要的 Jar。 lib/optional/ 包含了各个连接池和 Hibernate 提供的二级缓存所需要的 Jar,已经它们所需要的依赖。   https://www.cwiki.us/display/HIBERNATE/Obtaining+Hibernate
Hibernate 5 的模块/包(modules/artifacts)
Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义了 ORM 的特性和 API 以及一系列整合的 SPIs。 hibernate-envers Hibernate 历史的实体版本特性 hibernate-spatial Hibernate 的 Spatial/GIS 数据类型支持 hibernate-osgi Hibernate 支持运行 OSGi 容器 hibernate-agroal 整合 Agroal 连接池库到 Hibernate hibernate-c3p0 整合 C3P0 连接池库到 Hibernate hibernate-hikaricp 整合 HikariCP 连接池库到 Hibernate hibernate-vibur 整合 Vibur DBCP 连接池库到 Hibernate hibernate-proxool 整合 Proxool 连接池库到 Hibernate hibernate-jcache 整合 JCache 缓存特性到 Hibernate,使任何与其兼容的缓存实现能够成为 Hibernate 二级缓存的提供者 hibernate-ehcache 整合 Ehcache 缓存库到 Hibernate 中成为 Hibernate 的二级缓存提供者 https://www.cwiki.us/display/HIBERNATE/Obtaining+Hibernate
Hibernate 5 开始使用指南前言
同时在面向对象软件和关系型数据库进行工作,可能会非常复杂和费时。数据在对象和数据库之间可能会不一致,然后导致开发成本会非常高。 Hibernate 是一个针对 Java 环境的对象关系映射(Object/Relational Mapping (ORM))。对象关系映射的定义为从技术上在数据模型和关系数据库模型之间进行映射。请参考 http://en.wikipedia.org/wiki/Object-relational_mapping 来获得更高层次的讨论。同时,Martin Fowler 的 OrmHate 文章讨论了很多映射不吻合的问题。 尽管在使用 Hibernate 的时候不需要你具有很强的 SQL 背景,但是具有一些对 SQL 和相关概念的的基本了解能够帮助你更加快速和全面的理解 Hibernate。对数据模型(data modeling)原理的了解对使用 Hibernate 非常重要。http://www.agiledata.org/essays/dataModeling101.html 和 http://en.wikipedia.org/wiki/Data_modeling 能够帮助你从开始了解数据模型的原理。 Hibernate 对 Java 类到数据库表中的映射进行实现,同时也实现了 Java 数据类型到 SQL 数据类型。更进一步,Hibernate 能够对数据进行查询和检索。Hibernate 能够显著的减少针对 SQL 和 JDBC 的手动数据处理。Hibernate 的目标是通过尽量减少针对 SQL 和 JDBC 需要的手动操作,来减少 95% 的通用数据持久性相关程序开发任务。与其他持久性解决方案不同的是,Hibernate 并不隐藏 SQL 的强大功能,并保证你对关系技术和知识的投资与往常一样并有效。 Hibernate 可能不是针对数据中心的最佳解决方案。数据中心的意思是在数据库中实现所有的商业逻辑。Hibernate 针对面向对象域模型和基于 Java 中间层的商业逻辑非更有效率。Hibernate 能够帮助你删除和封装供应商特定 SQL 代码和简化从返回结果集从表格展示转换为对象。 如果你希望参与项目,请参考 http://hibernate.org/orm/contribute/ 链接。 针对本指南参考可用的项目和代码请参考 hibernate-tutorials.zip 中的内容。 https://www.cwiki.us/display/HIBERNATE/Preface
Git 如何针对项目修改本地提交提交人的信息
Git 如果不进行修改的话,在默认情况下将会使用全局的用户名称和电子邮件。 但是在 GitHub 中是通过用户邮件来进行提交人匹配的。 如何针对项目来修改提交的用户信息?   针对 TortoiseGit, 你可以在项目中选择 settings。 然后选择 Git 的 local 选项。 在 Local 中填入你希望使用的用户名和邮件地址,然后保存即可。 如果你不是使用 TortoiseGit,你可以在你项目 Check out 的目录中,打开文件: .git\config 在这个文件中的最下面,输入: [user] name = YuCheng Hu email = [email protected] 你可以根据你的用户名和密码换成你的。 然后保存即可。 一个大致的示例文件如下图:
Spring Batch 4.2 新特性
Spring Batch 4.2 的发行版主要增强了下面的改进: 使用 Micrometer 来支持批量指标(batch metrics) 支持从 Apache Kafka topics 读取/写入(reading/writing) 数据 支持从 Apache Avro 资源中读取/写入(reading/writing) 数据 改进支持文档 使用 Micrometer 的批量指标 本发行版本介绍了可以让你通过使用 Micrometer 来监控你的批量作业。在默认的情况下,Spring Batch 将会收集相关批量指标(包括,作业时间,步骤的时间,读取和写入的项目,以及其他的相关信息),和将这些指标通过 spring.batch 前缀(prefix)注册到 Micrometer 的全局指标中。 这些指标可以发布到任何能够支持 Micrometer 的  监控系统(monitoring system)中。 有关这个新特性的更多细节,请参考 Monitoring and metrics 章节中的内容。 Apache Kafka item 读取/写入 本发行版本添加了一个新的 KafkaItemReader 和 KafkaItemWriter ,用来从 Kafka 的 topics 中读取和写入。 有关更多这个新组建的信息,请参考:Javadoc。 Apache Avro item 读取/写入 本发行版本添加了一个新的 AvroItemReader 和 AvroItemWriter,用来从 Avro 资源中读取和写入。 有关更多这个新组建的信息,请参考: Javadoc。 文档更新 对参考的文档进行更新,以便于与其他 Spring 项目的文档风格保持一致。 4.1 版本的文档更新 下面的内容是 4.1 文档版本中的更新,我们没有将这部分内容从我们的 WIKI 中删除已保持历史信息的一致。 请参考下面链接获得 4.1 文档版本中的更新,在官方的文档中,下面的内容已经不在 4.2 的文档中了。 @SpringBatchTest Annotation @EnableBatchIntegration Annotation JSON support Bean Validation API support JSR-305 Support FlatFileItemWriterBuilder Enhancements https://www.cwiki.us/pages/viewpage.action?pageId=41685600


  • No labels