mockito_Mockito – JAXB的RETURNS_DEEP_STUBS

article/2025/9/24 14:47:48

mockito

很抱歉没有写一段时间,但是我正忙于为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

mockito


http://chatgpt.dhexx.cn/article/QAyGJISd.shtml

相关文章

gnu/stubs-32.h

64位系统下编译32位程序 g -m32 出现/usr/include/gnu/stubs.h:7:27: 致命错误&#xff1a;gnu/stubs-32.h&#xff1a;没有那个文件或目录&#xff0c; 解决&#xff1a;root用户下安装32位的glibc库文件 安装32位glibc库文件命令&#xff1a; yum install glibc-devel.i…

Mockito – JAXB的RETURNS_DEEP_STUBS

很抱歉没有写一段时间,但是我正忙于为DZone编写JBoss Drools Refcard,而且我正在写一本有关Mockito的书,因此我没有太多时间来写博客了…… 无论如何,最近在我当前的项目中,我对使用Mockito和JAXB结构进行单元测试有一个有趣的情况。 我们已经从为我们提供的模式生成的嵌…

Ubuntu linux解决stubs-32.h缺失

在ubuntu linux编译qnx平台时提示&#xff1a; fatal error: gnu/stubs-32.h: No such file or directory 查了一圈后 输入 sudo apt-get install libc6-dev-i386 此后stubs-32.h会出现在 /usr/include/x86_64-linux-gnu/gnu/ 将gnu文件夹移动到对应的qnx平台环境目录下即可…

第一章 使用SOAPUI测试和开发Web Services Stubs

Stub(桩件)的作用是&#xff1a;如果一个接口有很多方法&#xff0c;如果要实现这个接口&#xff0c;就要实现所有的方法。但是一个类从业务来说&#xff0c;可能只需要其中一两个方法。如果直接去实现这个接口&#xff0c;除了实现所需的方法&#xff0c;还要实现其他所有的无…

单元测试探析:什么是Stubs、Mocks、Spies、Dummies?带你了解4个核心工具

在单元测试中&#xff0c;对象之间的依赖往往交织到一起&#xff0c;需要拆成各个单元才能逐个击破&#xff0c;这也是单元测试的目的。如何将这些交织到一起的对象拆开&#xff0c;需要一些工具&#xff0c;这些工具业内人们称其为“测试替身”。 本文作者介绍了单元测试中的…

分布式CAP 定理

历史 这个定理起源于柏克莱加州大学University of California, Berkeley的计算机科学家埃里克布鲁尔在2000年的分布式计算原则研讨会&#xff08;Symposium on Principles of Distributed Computing&#xff08;PODC&#xff09;&#xff09;上提出的一个猜想。 在2002年&…

简单解释CAP定理

简单解释下分布式系统中的CAP定理: CAP定理: P-分区容错性, C-一致性, A-可用性 (易 ---> 难) CAP如何选择 > 在不同的业务领域中对CAP的选择有所不同; (典型的情况以及选取的规则) CAP的重要性 > CAP是分布式系统设计中最基础也最为关键的理论! (分布式系统不可能同…

CAP定理以及BASE定理详解

CAP 是分布式系统设计理论&#xff0c;BASE 是 CAP 理论中 AP 方案的延伸。 CAP定理 C&#xff1a;Consistency&#xff08;一致性&#xff09;、A: Availability&#xff08;可用性&#xff09;、P: Partition Tolerance&#xff08;分区容错性&#xff09; 一致性&#xf…

架构设计之「 CAP 定理 」

在计算机领域&#xff0c;如果是初入行就算了&#xff0c;如果是多年的老码农还不懂 CAP 定理&#xff0c;那就真的说不过去了。CAP可是每一名技术架构师都必须掌握的基础原则啊。 现在只要是稍微大一点的互联网项目都是采用 分布式 结构了&#xff0c;一个系统可能有多个节点组…

图解 CAP 定理(转载)

文章目录 CAP 定理不一致的产生解决方案保 CP 失 A保 AP 失 C CAP 定理 Consistency 一致性&#xff1a;访问分布式系统中任意节点&#xff0c;总能返回一致的结果 Every read receives the most recent write or an errorAvailability 可用性&#xff1a;分布式系统总能向客户…

分布式系统的CAP定理

目前只要是大型互联网项目都是采用分布式结构&#xff0c;一个系统可能有多个节点组成&#xff0c;每个节点都可能需要维护一份数据。那么如何维护各个节点之间的状态&#xff0c;如何保障各个节点之间数据的同步问题就是大家急需关注的事情了。CAP定理是分布式系统中最基础的原…

CAP 定理的含义

看到一篇很好的关于 CAP 定理的博文&#xff0c;顺便转发一下&#xff0c;by&#xff1a;阮一峰 分布式系统&#xff08;distributed system&#xff09;正变得越来越重要&#xff0c;大型网站几乎都是分布式的。 分布式系统的最大难点&#xff0c;就是各个节点的状态如何同步。…

CAP定理和BASE理论

2000 年的时候&#xff0c;Eric Brewer 教授提出了 CAP 猜想&#xff0c;2年后&#xff0c;被 Seth Gilbert 和 Nancy Lynch 从理论上证明了猜想的可能性&#xff0c;从此&#xff0c;CAP 理论正式在学术上成为了分布式计算领域的公认定理。并深深的影响了分布式计算的发展。 …

分布式-CAP定理

在分布式学习中&#xff0c;我们经常遇到一个概念便是CAP&#xff0c;它是分布式很重要的理论基础。很多分布式算法也是在不断的在解决相关问题&#xff0c;今天就让我们重新学习或者回顾一下这个知识点吧&#xff0c;加深印象打牢基础。 一、简介 CAP定理&#xff08;CAP theo…

佳文分享:CAP定理

1976年6月4号&#xff0c;周5&#xff0c;在远离音乐会大厅的一个楼上的房间内&#xff0c;在位于Manchester的Lesser Free Trade Hall &#xff0c;Sex Pistols 乐队&#xff08;注&#xff1a;Sex Pistols的经理人Malcolm McLaren 2010.4.8去世&#xff09;开始了他们的第一次…

谈谈对CAP定理的理解

谈谈对CAP定理的理解 CAP定理的常规解释是任何分布式系统只能在一致性(Consitency)&#xff0c;可用性(Availability)和分区容忍性(Partition Tolerance)中三选二。这个解释很让人费解&#xff0c;笔者在看了一些文章后谈谈我对它的理解&#xff0c;还请斧正。 从问题出发 假设…

分布式系统的 CAP 定理

CAP定理指出&#xff0c;在一个分布式系统中&#xff0c;对于一致性、可用性、分区容错这三个特性&#xff0c;不可能同时满足&#xff0c;而是必须有所舍弃。我们设计分布式系统时&#xff0c;必须在三者之间&#xff08;尤其是一致性和可用性之间&#xff09;有所取舍和平衡。…

简述CAP定理

CAP定理示意图&#xff1a; 一.CAP理论概述: CAP定理告诉我们&#xff0c;一个分布式系统不可能同时满足一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和分区容错性&#xff08;Partition tolerance&#xff09;这三个基本需求&…

CAP定理的含义

目录 定理解读 如何抉择 1998年&#xff0c;加州大学的计算机科学家 Eric Brewer 提出了分布式系统的三个指标&#xff1a; C&#xff1a;Consistency&#xff0c;一致性。在分布式系统中的所有数据备份&#xff0c;在同一时刻具有同样的值&#xff0c;所有节点在同一时刻读…

CAP定理是什么?

写在前面 本文隶属于专栏《100个问题搞定大数据理论体系》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和文献引用请见100个问题搞定大数据理论体系 解答 分布式系统不…