Mockito – JAXB的RETURNS_DEEP_STUBS

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

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

让我们看一下项目结构:

project_structure

项目结构非常简单–有一个Player.xsd模式文件,该文件由于使用了jaxb2-maven-plugin生成了与目标/ 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

协作机器人(Collaborative-Robot)安全碰撞的速度与接触力

协作机器人&#xff08;Collaborative-Robot&#xff09;的安全碰撞速度和接触力是一个非常重要的安全指标。在设计和使用协作机器人时&#xff0c;必须确保其与人类或其他物体的碰撞不会对人员造成伤害。 对于协作机器人的安全碰撞速度&#xff0c;一般会设定一个上限值&…

jackson - @JsonProperty的使用

jackson的maven依赖 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.5.3</version> </dependency> 所以引入这一个依赖就可以了 JsonProperty 此注解用于属…

python 表达式求值数据结构_python 数据结构与算法

python 数据结构与算法1 python常见数据结构性能1.1 List1.1.1 安索引取值和赋值1.1.2 列表append和__add__()1.1.3 使用timeit模块测试执行时间1.1.4 List基本操作的大O数量级1.2 Dict1.2.1 dict数据类型2 线性结构 Linear Structure2.1 栈Stack2.1.1 抽象数据类型Stack2.1.2 …

CSS3新特性罗列

接触CSS3这么久了&#xff0c;总是到要用的时候直接拿来用&#xff0c;却没有好好地总结归纳一下&#xff0c;那就在这里好好梳理一下吧。 CSS3边框&#xff1a; 圆角边框&#xff1a; 关键&#xff1a;border-radius <!DOCTYPE html> <html> <head> <…

Log4j 2:性能接近疯狂

最近&#xff0c;Apache社区中一位受人尊敬的成员尝试了Log4j 2并在Twitter上写道&#xff1a; TheASF &#xff03;log4j2摇摇欲坠 &#xff01; 性能接近疯狂^^ http://t.co/04K6F4Xkaa — Mark Struberg&#xff08;struberg&#xff09; 2013年5月7日 &#xff08;来自M…

Uncaught SyntaxError: Invalid Unicode escape sequence异常处理

今天碰到一个问题&#xff0c;页面报错&#xff1a;Uncaught SyntaxError: Invalid Unicode escape sequence ,{index:operate,name:operate,label:<s:text name"com.vrv.cems.ptp.installSoft.operate"></s:text>,width:getPerWidth(0.1),formatter:fun…

26、jQuery

一. jQuery简介 (一) jQuery是什么&#xff1a; 是一个javascript代码仓库 是一个快速的简洁的javascript框架&#xff0c;可以简化查询DOM对象、处理事件、制作动画、处理Ajax交互过程。 (二) jQuery优势 体积小&#xff0c;使用灵巧(只需引入一个js文件)方便的选择页面元素(模…

玩转ajax

1.什么是ajax&#xff1f; Ajax 是 Asynchronous JavaScript and XML&#xff08;以及 DHTML 等&#xff09;的缩写。 2.ajax需要什么基础? HTML 用于建立 Web 表单并确定应用程序其他部分使用的字段。 JavaScript 代码是运行 Ajax 应用程序的核心代码&#xff0c;帮助改…

Spring MVC:验证器和@InitBinder

很难想象没有针对用户数据的验证逻辑的Web应用程序。 几乎所有用户的数据都有一些限制&#xff0c;例如&#xff0c;出生日期应由日&#xff0c;月&#xff0c;年等组成。SpringMVC拥有自己的数据验证解决方案&#xff0c;并且在Validator界面的帮助下可用。 Spring MVC Vali…

ADB 调试

1、adb简介 adb的全称为Android Debug Bridge&#xff0c;就是起到调试桥的作用。通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序&#xff0c;说白了就是debug工具。adb的工作方式比较特殊&#xff0c;采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯&#xff…

margin折叠-从子元素margin-top影响父元素引出的问题

正在做一个手机端电商项目&#xff0c;顶部导航栈的布局是一个div包含一个子div&#xff0c;如果给在正常文档流中的子div一个垂直margin-top&#xff0c;神奇的现象出现了&#xff0c;两父子元素的边距没变&#xff0c;但父div跟着一起往下走了&#xff01; html代码&#xff…

Flexible 弹性盒子模型之CSS flex-shrink 属性

实例 让第二个元素收缩到其他元素的三分之一&#xff1a; 效果预览 div:nth-of-type(2){flex-shrink:3;}浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号。 紧跟在 -webkit-, -ms- 或 -moz- 后的数字为支持该前缀属性的第一个版本。 属性 flex-shrink29.021.…

idea 新建的java项目没发run_IntelliJ IDEA创建普通的Java 项目及创建 Java 文件并运行的教程...

最近突然看到这篇几年前随手记录的文章&#xff0c;居然浏览量那么高。看来很多小伙伴也开始从 Eclipse 转到 IDEA&#xff0c;这里为了让大家更好的掌握 IDEA 的使用&#xff0c;我建议大家可以看看下面这个 IDEA 教程。首先&#xff0c;确保 IDEA 软件正确安装完成&#xff0…

如何在Maven中运行Ant目标?

maven-antrun-plugin允许我们在各种maven构建阶段中运行ant目标。 我将专门为具有开发环境的开发人员解释maven-antrun-plugin的非常实际的用法。 通常&#xff0c;使用maven build&#xff0c;您会将项目捆绑到war文件或ear文件中。 您可以使用maven-antrun-plugin直接将此w…

PHP基本知识

php为服务端的脚本语言&#xff0c;它的使用需要打开WAMP的开发环境&#xff0c;php也可以用制作网页的DW制作&#xff0c;文件需保存在wamp文件夹内的www文件夹里面。 嵌入php代码所使用的标签&#xff1a;<?php ?>&#xff1b; 运行php条件&#xff1a; 1.电脑上需…

java semaphore 等待_Java并发编程系列之Semaphore详解

简单介绍我们以饭店为例&#xff0c;假设饭店只有三个座位&#xff0c;一开始三个座位都是空的。这时如果同时来了三个客人&#xff0c;服务员人允许他们进去用餐&#xff0c;然后对外说暂无座位。后来的客人必须在门口等待&#xff0c;直到有客人离开。这时&#xff0c;如果有…

Java垃圾收集蒸馏

串行&#xff0c;并行&#xff0c;并发&#xff0c;CMS&#xff0c;G1&#xff0c;Young Gen&#xff0c;New Gen&#xff0c;Old Gen&#xff0c;Perm Gen&#xff0c;Eden&#xff0c;Tenured&#xff0c;Survivor Spaces&#xff0c;Safepoints和数百个JVM启动标志。 在尝试…

设计模式(二)模板方法模式

1.模版方法模式简介 模版方法模式介绍 在软件开发中&#xff0c;有时会遇到类似的情况&#xff0c;某个方法的实现需要多个步骤&#xff0c;其中有些步骤是固定的&#xff0c;而有些步骤并不固定&#xff0c;存在可变性。为了提高代码的复用性和系统的灵活性&#xff0c;可以…

题解 P2598 【[ZJOI2009]狼和羊的故事】

P2598 [ZJOI2009]狼和羊的故事 题目描述 “狼爱上羊啊爱的疯狂&#xff0c;谁让他们真爱了一场&#xff1b;狼爱上羊啊并不荒唐&#xff0c;他们说有爱就有方向&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;” Orez听到这首歌&#xff0c;心想&am…

前端机试面试题

一、题目要求 1、请实现“https://channel.jd.com/fashion.html”超值购部分内容。 2、使用CSS DIV实现页面布局&#xff0c;页面居中&#xff0c;文字颜色效果要求一致。40分 3、鼠标悬停时的动画效果。10分 4、“进入查看”标签与样式。10分 5、定义一个javascript数组&…