mockito

抱歉,有一段时间没有写东西,但是我正忙于为DZone编写JBoss Drools Refcard,而且我正在写一本有关Mockito的书,因此我没有太多时间来写博客了……

无论如何,最近在我当前的项目中,我对使用Mockito和JAXB结构进行单元测试有一个有趣的情况。 我们已经从为我们提供的模式生成的嵌套了非常深的JAXB结构,这意味着我们无论如何都无法更改它。

让我们看一下项目结构:

项目结构非常简单–有一个Player.xsd模式文件,该文件由于使用了jaxb2-maven-plugin生成了与相应目录下的target / jaxb /文件夹中的模式相对应的生成的JAXB Java类。 pom.xml 。 说到其中,让我们看一下pom.xml文件。

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.blogspot.toomuchcoding</groupId><artifactId>mockito-deep_stubs</artifactId><version>0.0.1-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.6</maven.compiler.source><maven.compiler.target>1.6</maven.compiler.target></properties><repositories><repository><id>spring-release</id><url>http://maven.springframework.org/release</url></repository><repository><id>maven-us-nuxeo</id><url>https://maven-us.nuxeo.org/nexus/content/groups/public</url></repository></repositories><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version></dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-all</artifactId><version>1.9.5</version><scope>test</scope></dependency></dependencies><build><pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.5.1</version></plugin></plugins></pluginManagement><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>jaxb2-maven-plugin</artifactId><version>1.5</version><executions><execution><id>xjc</id><goals><goal>xjc</goal></goals></execution></executions><configuration><packageName>com.blogspot.toomuchcoding.model</packageName><schemaDirectory>${project.basedir}/src/main/resources/xsd</schemaDirectory></configuration></plugin></plugins></build></project>

除了先前定义的项目依赖关系外,如先前在配置节点的jaxb2-maven-plugin中所述,您还可以基于schemaDirectory值定义packageName值,该值定义将JAXB类生成到哪个包,插件可以在其中找到适当的架构文件。

说到这,让我们检查一下Player.xsd模式文件(类似于我的Spring JMS自动消息转换文章中提供的文件):

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><xsd:element name="PlayerDetails"><xsd:complexType><xsd:sequence><xsd:element name="Name" type="xsd:string"/><xsd:element name="Surname" type="xsd:string"/><xsd:element name="Position" type="PositionType"/><xsd:element name="Age" type="xsd:int"/><xsd:element name="ClubDetails" type="ClubDetails"/></xsd:sequence></xsd:complexType></xsd:element><xsd:complexType name="ClubDetails"><xsd:sequence><xsd:element name="TeamName" type="xsd:string"/><xsd:element name="Country" type="CountryDetails"/></xsd:sequence></xsd:complexType><xsd:complexType name="CountryDetails"><xsd:sequence><xsd:element name="CountryName" type="xsd:string"/><xsd:element name="CountryCode" type="CountryCodeDetails"/></xsd:sequence></xsd:complexType><xsd:complexType name="CountryCodeDetails"><xsd:sequence><xsd:element name="CountryName" type="xsd:string"/><xsd:element name="CountryCode" type="CountryCodeType"/></xsd:sequence></xsd:complexType><xsd:simpleType name="CountryCodeType"><xsd:restriction base="xsd:string"><xsd:enumeration value="PL"/><xsd:enumeration value="GER"/><xsd:enumeration value="FRA"/><xsd:enumeration value="ENG"/><xsd:enumeration value="ESP"/></xsd:restriction></xsd:simpleType><xsd:simpleType name="PositionType"><xsd:restriction base="xsd:string"><xsd:enumeration value="GK"/><xsd:enumeration value="DEF"/><xsd:enumeration value="MID"/><xsd:enumeration value="ATT"/></xsd:restriction></xsd:simpleType></xsd:schema>

如您所见,我正在定义一些复杂的类型,尽管这些类型可能没有商业意义,但您可以在现实生活中找到此类示例。

让我们找出我们要测试的方法的外观。 在这里,我们有PlayerServiceImpl实现了PlayerService接口:

package com.blogspot.toomuchcoding.service;import com.blogspot.toomuchcoding.model.PlayerDetails;/*** User: mgrzejszczak* Date: 08.06.13* Time: 19:02*/
public class PlayerServiceImpl implements PlayerService {@Overridepublic boolean isPlayerOfGivenCountry(PlayerDetails playerDetails, String country) {String countryValue = playerDetails.getClubDetails().getCountry().getCountryCode().getCountryCode().value();return countryValue.equalsIgnoreCase(country);}
}

我们从JAXB生成的类中获取嵌套元素。 尽管它违反了Demeter的定律,但调用结构方法是很常见的,因为JAXB生成的类实际上是结构,因此,我完全同意Martin Fowler的观点,即应将其称为Demeter建议。 无论如何,让我们看看如何测试该方法:

@Testpublic void shouldReturnTrueIfCountryCodeIsTheSame() throws Exception {//givenPlayerDetails playerDetails = new PlayerDetails();ClubDetails clubDetails = new ClubDetails();CountryDetails countryDetails = new CountryDetails();CountryCodeDetails countryCodeDetails = new CountryCodeDetails();playerDetails.setClubDetails(clubDetails);clubDetails.setCountry(countryDetails);countryDetails.setCountryCode(countryCodeDetails);countryCodeDetails.setCountryCode(CountryCodeType.ENG);//whenboolean playerOfGivenCountry = objectUnderTest.isPlayerOfGivenCountry(playerDetails, COUNTRY_CODE_ENG);//thenassertThat(playerOfGivenCountry, is(true));}

该函数检查是否具有相同的国家(地区)代码,是否从该方法中获取了一个真正的布尔值。 唯一的问题是要创建输入消息时发生的集合和实例化的数量。 在我们的项目中,嵌套元素的数量是原来的两倍,因此您只能想象创建输入对象所需的代码数量…

那么如何改善此代码呢? Mockito可以与Mockito.mock(…)方法的RETURN_DEEP_STUBS默认答案一起使用:

@Testpublic void shouldReturnTrueIfCountryCodeIsTheSameUsingMockitoReturnDeepStubs() throws Exception {//givenPlayerDetails playerDetailsMock = mock(PlayerDetails.class, RETURNS_DEEP_STUBS);CountryCodeType countryCodeType = CountryCodeType.ENG;when(playerDetailsMock.getClubDetails().getCountry().getCountryCode().getCountryCode()).thenReturn(countryCodeType);//whenboolean playerOfGivenCountry = objectUnderTest.isPlayerOfGivenCountry(playerDetailsMock, COUNTRY_CODE_ENG);//thenassertThat(playerOfGivenCountry, is(true));}

因此,这里发生的事情是您使用Mockito.mock(…)方法并提供了RETURNS_DEEP_STUBS答案,该答案将为您自动创建模拟。 请注意,不能嘲笑枚举,这就是为什么您不能在Mockito.when(…)函数playerDetailsMock.getClubDetails()。getCountry()。getCountryCode()。getCountryCode()。getValue()中编写代码的原因。

总结一下,您可以比较两个测试的可读性,并通过使用Mockito RETURNS_DEEP_STUBS默认答案来了解使用JAXB结构有多清晰。

当然,该示例的资源可从BitBucket和GitHub获得。

参考: Mockito – JAXB的RETURNS_DEEP_STUBS,来自我们的JCG合作伙伴Marcin Grzejszczak,位于Blog上,用于编码上瘾者博客。

翻译自: https://www.javacodegeeks.com/2013/07/mockito-returns_deep_stubs-for-jaxb.html

mockito

mockito_Mockito – JAXB的RETURNS_DEEP_STUBS相关推荐

  1. Mockito – JAXB的RETURNS_DEEP_STUBS

    很抱歉没有写一段时间,但是我正忙于为DZone编写JBoss Drools Refcard,而且我正在写一本有关Mockito的书,因此我没有太多时间来写博客了-- 无论如何,最近在我当前的项目中,我 ...

  2. eclipse xsd 生成java,Generate XSD from JAXB Java Classes using Eclipse

    学习使用Eclipse IDE 从带有JAXB注释的Java类创建XML模式文档(xsd) . 1) Add JAXB Annotations to Java Classes 第一步是在Java类中添 ...

  3. java jaxb 集合_java.util.List是一个接口,JAXB不能处理接口

    java.util.List是一个接口,JAXB不能处理接口 尝试部署我的应用程序时,我似乎得到以下exception: Caused by: com.sun.xml.bind.v2.runtime. ...

  4. JAXB 转 XML乱码

    为JAXB和response设置编码,解决wechat4j中文乱码 1 https://blog.csdn.net/qing_gee/article/details/52788962 2 在web环境 ...

  5. Java Jaxb JavaBean与XML互转

    1.Jaxb - Java Arcitecture for XML Binding 是业界的一个标准,是一项能够依据XML Schema产生Java类的技术. Jaxb2.0是Jdk1.6的组成部分. ...

  6. java方便适配器,JAXB简单自定义适配器以及简单使用

    JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...

  7. jaxb_使用JAXB时

    jaxb 并没有很多示例说明这一点,但是如何在应用程序中使用JAXB可以在性能(和内存使用)方面产生巨大差异. 这个例子 在此博客文章中,我将使用一个名为Membership的示例对象,看起来像这样: ...

  8. java xml 变量替换_Java JAXB如何将XmlElements重新定义为现有变量

    当使用jaxb进行解组时,我在A类中有一些东西: public class A { @XmlElements( { // @XmlElement(name = "g", type ...

  9. jaxb和dozer简介

    一.jaxb是什么      JAXB是Java Architecture for XML Binding的缩写.可以将一个Java对象转变成为XML格式,反之亦然.      我们把对象与关系数据库 ...

最新文章

  1. html不读取缓存,如何让前端浏览器不进行缓存
  2. 正则表达式实战---爬取多张图片
  3. JavaScript重载解读
  4. get请求可以传body吗_详解用 Go 语言解析各种 HTTP 请求的方法
  5. Android Studio安装使用过程中踩到的坑
  6. ad16不能去除铺铜_海水小讲堂006 铜离子的正确使用姿势
  7. 查找学生链表c语言,【查找链表面试题】面试问题:C语言实现学生… - 看准网...
  8. 如何获取InnoDB树的高度
  9. 机器学习第六回——无监督学习
  10. Atitit.跨语言  文件夹与文件的io操作集合  草案
  11. Ext.grid.EditorGridPanel列表复选框不能随意多选的问题
  12. 算法初阶05:魔方矩阵
  13. 成都信息工程大学2019级概率论c类试题
  14. word文档输入带勾的复选框
  15. MBA提前面试:商学院看重软实力
  16. python AMQP 客户端连接
  17. 软件工程导论患者监护系统可行性研究
  18. 爬虫基础-requests库的使用
  19. 基于ffmpeg+opengl+opensl es的android视频播放器
  20. Adobe Dreamweaver CS5的时候,显示“安装程序无法初始化,请下载Adobe Support Advisor检测该问题

热门文章

  1. npm使用入门(package.json)
  2. Java多线程 - 控制线程
  3. The prefix tx for element tx:annotation-driven is not bound.
  4. WPF下可编辑Header的Tab控件实现
  5. javascript es6 特性简介
  6. golang strings Replace 字符串替换
  7. windows下使用自带certutil工具校验文件MD5、SHA1、SHA256
  8. linux c remove 删除文件或目录函数
  9. CMake 指定安装目录
  10. linux 开机自启动设置 inittab 详解