Mockito – JAXB的RETURNS_DEEP_STUBS
很抱歉沒有寫一段時間,但是我正忙于為DZone編寫JBoss Drools Refcard,而且我正在寫一本有關Mockito的書,因此我沒有太多時間來寫博客了……
無論如何,最近在我當前的項目中,我對使用Mockito和JAXB結構進行單元測試有一個有趣的情況。 我們已經從為我們提供的模式生成的嵌套了非常深的JAXB結構,這意味著我們無論如何都無法更改它。
讓我們看一下項目結構:
項目結構非常簡單–有一個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獲得 。
翻譯自: https://www.javacodegeeks.com/2013/07/mockito-returns_deep_stubs-for-jaxb.html
總結
以上是生活随笔為你收集整理的Mockito – JAXB的RETURNS_DEEP_STUBS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国税简易征收备案说明怎么写(国税简易征收
- 下一篇: Log4j 2:性能接近疯狂