锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲kkk4444在线观看,亚洲第一成年网站视频,中国china体内裑精亚洲日本http://www.tkk7.com/zyl/category/17750.html濂藉ソ瀛︿範錛屽ぉ澶╁悜涓?/description>zh-cnTue, 27 Feb 2007 20:02:06 GMTTue, 27 Feb 2007 20:02:06 GMT60鍏充簬TestNGhttp://www.tkk7.com/zyl/archive/2006/10/05/73468.html甯冭。閮?/dc:creator>甯冭。閮?/author>Thu, 05 Oct 2006 07:44:00 GMThttp://www.tkk7.com/zyl/archive/2006/10/05/73468.htmlhttp://www.tkk7.com/zyl/comments/73468.htmlhttp://www.tkk7.com/zyl/archive/2006/10/05/73468.html#Feedback2http://www.tkk7.com/zyl/comments/commentRss/73468.htmlhttp://www.tkk7.com/zyl/services/trackbacks/73468.html聽聽聽聽聽聽 TestNG鏄竴涓笉閿欑殑嫻嬭瘯妗嗘灦錛屽挨鍏舵槸鐢ㄤ簬妯″潡嫻嬭瘯錛屼互鍙婂ぇ鑼冨洿鐨勬祴璇曘傜浉瀵逛簬JUnit鏉ヨ錛屾洿涓虹伒媧匯傞殢鐫JUnit4鐨勬帹鍑猴紝寰堝鍔熻兘閮戒笌TestNG鐩鎬技錛屼絾鐩稿浜嶫Unit4錛孴estNG榪樻槸鏈夊緢澶氶儴鍒嗘槸鏈夊尯鍒殑銆?br />聽聽聽聽聽 TestNG鐨処DE鏀寔涔熶笉閿欙紝瀵逛簬Eclipse,Idea,Ant閮芥湁寰堝ソ鐨勬敮鎸併?br />聽聽聽聽聽 鍏堟潵鐪嬩竴鐪嬫庝箞浣跨敤TestNG錛屽綋鐒墮鍏堥渶瑕佷笅杞絋estNG鍖呫傜洰鍓嶇殑鐗堟湰涓?.1錛屼笅杞藉湴鍧濡備笅錛?br />聽 聽 聽 http://testng.org/doc/download.html 錛屼篃鍙互涓嬭澆鐩稿簲鐨凟clipse鎻掍歡銆?br />聽聽聽聽聽 榪愯TestNG錛屽彲浠ヤ粠鍛戒護琛屾垨鑰匢DE錛屾垨鑰匒nt涓繍琛屻?br />聽聽聽聽聽 鍛戒護琛岋細
聽聽聽聽聽 java org.testng.TestNG -groups windows,linux -testclass org.test.MyTest
聽聽聽聽聽
瀵逛簬澶у瀷鐨勬祴璇曪紝闇瑕佸畾涔変竴涓獂ml鏂囦歡錛屼竴鑸負testng.xml銆?br />聽聽聽


<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suitename="Suite1"聽聽 verbose="1" >
<testname="Nopackage" >
<classes>
聽聽聽聽聽聽聽<classname="NoPackageTest"聽 />
</classes>
</test>

<testname="Regression1"聽聽 >
<classes>
<classname="test.sample.ParameterSample"聽 />
<classname="test.sample.ParameterTest" />
</classes>
</test>
</suite>

聽聽聽聽 java org.testng.TestNG testng.xml
聽聽聽
聽 褰撶劧濡傛灉浣跨敤Eclipse鎻掍歡錛屽氨綆鍗曞浜嗐?b>

聽聽聽聽聽 涓嬮潰鏉ョ湅涓涓嬶紝濡備綍鏉ュ疄鐜版祴璇曠殑錛屼笌JUnit4 宸笉澶氾紙鎬鐤戯紝JUnit4鏄笉鏄湁鎶勮TestNG鐨勬垚鍒嗭級銆?br />聽聽聽 聽 澹版槑嫻嬭瘯鏂規(guī)硶濡備笅錛?span style="font-size: 10.5pt; font-family: "Times New Roman";" lang="EN-US">


  @Test
public void testMethod1() {
System.out.println("in testMethod1");
}

@Test
public void testMethod2() {
System.out.println("in testMethod2");
}

聽聽聽聽 鍩烘湰涓婇兘鏄噰鐢╦ava5鐨勬敞閲婂疄鐜扮殑銆?br />聽聽聽聽 涓嶫Unit4 涓嶅悓鍦ㄤ簬錛屾祴璇曟柟娉曞彲浠ュ垎緇勶紝瀹冨彲浠ユ牴鎹濡傝繍琛屾椂闂磋繖鏍風殑鐗瑰緛鏉ュ嫻嬭瘯鍒嗙被銆?br />
  @Test(groups={"fun1","fun2"})
public void testMethod1() {
System.out.println("in testMethod1");
}

@Test(groups={"fun1"})
public void testMethod2() {
System.out.println("in testMethod2");
}

聽聽聽聽聽 鍚孞Unit4 涓鏍鳳紝鍚屾牱鏀寔Before,After鏂規(guī)硶錛屽鍚宻etUp 鍜宼earDown,涓嶈繃TestNG鏇翠負鐏墊椿錛屾敮鎸佸悇縐嶇鍚嶆柟寮忥紝濡俻rivate,protected銆?br />
聽聽聽 @BeforeMethod
聽聽聽 protected void beforeMethod() {
聽聽聽聽聽聽聽 System.out.println("in beforeMethod");
聽聽聽 }

聽聽聽 @AfterMethod
聽聽聽 protected void afterMethod() {
聽聽聽聽聽聽聽 System.out.println("in afterMethod");
聽聽聽 }

聽聽聽聽 鍚屾牱涔熸敮鎸丅eforeClass 鍜孉fterClass錛屽彧鎵ц涓嬈$殑鏂規(guī)硶錛屼絾鏄彲浠ヤ笉闇瑕佷嬌鐢╯tatic絳懼悕
聽聽聽 @BeforeClass
聽聽聽 protected void beforeClassMethod() {
聽聽聽聽聽聽聽 System.out.println("in beforeClassMethod");
聽聽聽 }

聽聽聽 @AfterClass
聽聽聽 protected void afterClassMethod() {
聽聽聽聽聽聽聽 System.out.println("in afterClassMethod");
聽聽聽 }

聽聽聽聽 涓嶅悓浜嶫Unit4錛孴estNG鎻愪緵浜嗕互涓嬬殑鐗規(guī)э細
聽聽聽聽 渚濊禆鎬ф祴璇?br />聽聽聽聽 JUnit 妗嗘灦鎯寵揪鍒扮殑涓涓洰鏍囧氨鏄祴璇曢殧紱匯傚畠鐨勭己鐐規(guī)槸錛氫漢浠緢闅劇‘瀹氭祴璇曠敤渚嬫墽琛岀殑欏哄簭錛岃岃繖瀵逛簬浠諱綍綾誨瀷鐨勪緷璧栨ф祴璇曢兘闈炲父閲嶈銆傚紑鍙戣呬滑浣跨敤浜嗗縐嶆妧鏈潵瑙e喅榪欎釜闂錛屼緥濡傦紝鎸夊瓧姣嶉『搴忔寚瀹氭祴璇曠敤渚嬶紝鎴栨槸鏇村鍦頒緷闈?fixture 鏉ラ傚綋鍦拌В鍐抽棶棰樸?br />聽聽聽聽聽 涓?JUnit 涓嶅悓錛孴estNG 鍒╃敤 Test 娉ㄩ噴鐨? dependsOnMethods 灞炴ф潵搴斿嫻嬭瘯鐨勪緷璧栨ч棶棰樸傛湁浜嗚繖涓究鍒╃殑鐗規(guī)э紝灝卞彲浠ヨ交鏉炬寚瀹氫緷璧栨柟娉曘傚浠ヤ笅瀹氫箟錛歵estMethod2渚濊禆浜巘estMethod1銆?br />聽聽聽
聽聽聽 @Test
聽聽聽 public void testMethod1() {
聽聽聽聽聽聽聽 System.out.println("in testMethod1");
聽聽聽 }

聽聽聽 @Test(dependsOnMethods="testMethod1")
聽聽聽 public void testMethod2() {
聽聽聽聽聽聽聽 System.out.println("in testMethod2");
聽聽聽 }
褰撶劧濡傛灉testMethod1澶辮觸鐨勮瘽錛岄粯璁estMethod2涔熶笉浼氭墽琛岋紝涓嶈繃鍙渶瑕佽緗產lwaysRun = true錛屽垯鍙互璺寵繃testMethod1

聽聽聽 @Test
聽聽聽 public void testMethod1() {
聽聽聽聽聽聽聽 System.out.println("in testMethod1");
聽聽聽聽聽聽聽 throw new RuntimeException("failed");
聽聽聽 }

聽聽聽 @Test(dependsOnMethods="testMethod1",alwaysRun = true)
聽聽聽 public void testMethod2() {
聽聽聽聽聽聽聽 System.out.println("in testMethod2");
聽聽聽 }

聽聽聽聽 澶辮觸鍜岄噸榪愯
聽聽聽聽
鍦ㄥぇ鍨嬫祴璇曞浠朵腑錛岃繖縐嶉噸鏂拌繍琛屽け璐ユ祴璇曠殑鑳藉姏鏄懼緱灝や負鏂逛究銆傝繖鏄?TestNG 鐙湁鐨勪竴涓壒鎬с傚湪 JUnit 4 涓紝濡傛灉嫻嬭瘯濂椾歡鍖呮嫭 1000 欏規(guī)祴璇曪紝鍏朵腑 3 欏瑰け璐ワ紝寰堝彲鑳藉氨浼氳揩浣挎?zhèn)ㄩ噸鏂皹q愯鏁翠釜嫻嬭瘯濂椾歡錛堜慨鏀歸敊璇互鍚庯級銆備笉鐢ㄨ錛岃繖鏍風殑宸ヤ綔鍙兘浼氳楄垂鍑犱釜灝忔椂銆?

涓鏃?TestNG 涓嚭鐜板け璐ワ紝瀹冨氨浼氬垱寤轟竴涓?XML 閰嶇疆鏂囦歡錛屽澶辮觸鐨勬祴璇曞姞浠ヨ鏄庛傚鏋滃埄鐢ㄨ繖涓枃浠舵墽琛?TestNG 榪愯紼嬪簭錛孴estNG 灝?i>鍙?/i> 榪愯澶辮觸鐨勬祴璇曘傛墍浠ワ紝鍦ㄥ墠闈㈢殑渚嬪瓙閲岋紝鎮(zhèn)ㄥ彧闇閲嶆柊榪愯閭d笁涓け璐ョ殑嫻嬭瘯錛岃屼笉鏄暣涓祴璇曞浠躲傚彲浠ョ湅鍒頒互涓嬬殑澶辮觸鏂囦歡錛屼竴鑸懡鍚嶄負testng-failed.xml錛屼互鍚庡彧闇瑕佽繍琛屾鏂囦歡灝卞彲浠ヤ簡銆?/p>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="5" verbose="1" name="Failed suite [testng]" parallel="false" annotations="JDK5">
聽 <test name="demo.testng.Test2(failed)" junit="false" parallel="false" annotations="JDK5">
聽聽聽 <classes>
聽聽聽聽聽 <class name="demo.testng.Test2">
聽聽聽聽聽聽聽 <methods>
聽聽聽聽聽聽聽聽聽 <include name="testMethod1"/>
聽聽聽聽聽聽聽聽聽 <include name="testMethod2"/>
聽聽聽聽聽聽聽聽聽 <include name="beforeClassMethod"/>
聽聽聽聽聽聽聽聽聽 <include name="afterClassMethod"/>
聽聽聽聽聽聽聽聽聽 <include name="beforeMethod"/>
聽聽聽聽聽聽聽聽聽 <include name="afterMethod"/>
聽聽聽聽聽聽聽 </methods>
聽聽聽聽聽 </class>
聽聽聽 </classes>
聽 </test>
</suite>

聽聽聽 鍙傛暟鍖栨祴璇?br />聽聽聽 TestNG 涓彟涓涓湁瓚g殑鐗規(guī)ф槸鍙傛暟鍖栨祴璇?/i>銆傚湪 JUnit 涓紝濡傛灉鎮(zhèn)ㄦ兂鏀瑰彉鏌愪釜鍙楁祴鏂規(guī)硶鐨勫弬鏁扮粍錛屽氨鍙兘緇?i>姣忎釜 涓嶅悓鐨勫弬鏁扮粍緙栧啓涓涓祴璇曠敤渚嬨傚鏁版儏鍐典笅錛岃繖涓嶄細甯︽潵澶楹葷儲銆傜劧鑰岋紝鎴戜滑鏈夋椂浼氱鍒頒竴浜涙儏鍐碉紝瀵瑰叾涓殑涓氬姟閫昏緫錛岄渶瑕佽繍琛岀殑嫻嬭瘯鏁扮洰鍙樺寲鑼冨洿寰堝ぇ銆?br />聽聽聽 鍦ㄨ繖鏍風殑鎯呭喌涓嬶紝浣跨敤 JUnit 鐨勬祴璇曚漢鍛樺線寰浼氳漿鑰屼嬌鐢?FIT 榪欐牱鐨勬鏋訛紝鍥犱負榪欐牱灝卞彲浠ョ敤琛ㄦ牸鏁版嵁椹卞姩嫻嬭瘯銆備絾鏄?TestNG 鎻愪緵浜嗗紑綆卞嵆鐢ㄧ殑綾諱技鐗規(guī)с傞氳繃鍦?TestNG 鐨?XML 閰嶇疆鏂囦歡涓斁鍏ュ弬鏁板寲鏁版嵁錛屽氨鍙互瀵逛笉鍚岀殑鏁版嵁闆嗛噸鐢ㄥ悓涓涓祴璇曠敤渚嬶紝鐢氳嚦鏈夊彲鑳戒細寰楀埌涓嶅悓鐨勭粨鏋溿傝繖縐嶆妧鏈畬緹庡湴閬垮厤浜?i>鍙兘 鍋囧畾涓鍒囨甯哥殑嫻嬭瘯錛屾垨鏄病鏈夊杈圭晫榪涜鏈夋晥楠岃瘉鐨勬儏鍐點?br />

聽聽 @Parameters( { "first-name"
聽聽聽 })

聽聽聽 @Test(groups = { "param"
聽聽聽 })
聽聽聽 public void testParm(String firstName) {
聽聽聽聽聽聽聽 System.out.println("invoked testString:" + firstName);
聽聽聽聽聽聽聽 assertEquals(firstName, "Test");
聽聽聽 }

鍦▁ml涓緗浉搴旂殑鍙傛暟鍊鹼紝鍙互鏀懼叆suite涓嬮潰鎴栬卼est涓嬮潰錛屽鏋滃悓鍚嶏紝涓鑸瑃est涓嬮潰鐨勫畾涔夎鐩杝uite瀹氫箟銆?br />
<parameter name="first-name" value="Test"/>

聽聽聽 楂樼駭鍙傛暟鍖栨祴璇?br />聽聽聽 灝界浠庝竴涓?XML 鏂囦歡涓娊鍙栨暟鎹細寰堟柟渚匡紝浣嗗伓灝斾細鏈変簺嫻嬭瘯闇瑕佹湁澶嶆潅綾誨瀷錛岃繖浜涚被鍨嬫棤娉曠敤 String 鎴栧師璇兼潵琛ㄧず銆俆estNG 鍙互閫氳繃瀹冪殑 @DataProvider 娉ㄩ噴澶勭悊榪欐牱鐨勬儏鍐點?code>@DataProvider 娉ㄩ噴鍙互鏂逛究鍦版妸澶嶆潅鍙傛暟綾誨瀷鏄犲皠鍒版煇涓祴璇曟柟娉曘備緥濡傦紝娓呭崟 7 涓殑 verifyHierarchy 嫻嬭瘯涓紝鎴戦噰鐢ㄤ簡閲嶈澆鐨?buildHierarchy 鏂規(guī)硶錛屽畠鍙帴鏀朵竴涓?Class 綾誨瀷鐨勬暟鎹? 瀹冩柇璦錛坅sserting錛?code>Hierarchy 鐨? getHierarchyClassNames() 鏂規(guī)硶搴旇榪斿洖涓涓傚綋鐨勫瓧絎︿覆鏁扮粍錛?br />
package test.com.acme.da.ng;

import java.util.Vector;

import static org.testng.Assert.assertEquals;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import com.acme.da.hierarchy.Hierarchy;
import com.acme.da.hierarchy.HierarchyBuilder;

public class HierarchyTest {

@DataProvider(name = "class-hierarchies")
public Object[][] dataValues(){
return new Object[][]{
{Vector.class, new String[] {"java.util.AbstractList",
"java.util.AbstractCollection"}},
{String.class, new String[] {}}
};
}

@Test(dataProvider = "class-hierarchies")
public void verifyHierarchy(Class clzz, String[] names)
throws Exception{
Hierarchy hier = HierarchyBuilder.buildHierarchy(clzz);
assertEquals(hier.getHierarchyClassNames(), names,
"values were not equal");
}
}

聽聽聽聽 褰撶劧榪樻湁涓浜涘叾浠栫殑鐗規(guī)э紝灝變笉涓涓璇︾粏璇存槑浜嗭紝鏈夊叴瓚e彲浠ュ弬鑰冪浉搴旂殑testNG鏂囨。銆?br />聽聽聽聽聽 JUnit 4 鍜?TestNG 鍦ㄨ〃闈笂鏄浉浼肩殑銆傜劧鑰岋紝璁捐 JUnit 鐨勭洰鐨勬槸涓轟簡鍒嗘瀽浠g爜鍗曞厓錛岃?TestNG 鐨勯鏈熺敤閫斿垯閽堝楂樼駭嫻嬭瘯銆傚浜庡ぇ鍨嬫祴璇曞浠訛紝鎴戜滑涓嶅笇鏈涘湪鏌愪竴欏規(guī)祴璇曞け璐ユ椂灝卞緱閲嶆柊榪愯鏁板崈欏規(guī)祴璇曪紝TestNG 鐨勭伒媧繪у湪榪欓噷灝や負鏈夌敤銆傝繖涓や釜妗嗘灦閮芥湁鑷繁鐨勪紭鍔匡紝鎮(zhèn)ㄥ彲浠ラ殢鎰忓悓鏃朵嬌鐢ㄥ畠浠?

]]>
Junit 4鏂扮殑鐗規(guī)?/title><link>http://www.tkk7.com/zyl/archive/2006/10/03/73255.html</link><dc:creator>甯冭。閮?/dc:creator><author>甯冭。閮?/author><pubDate>Tue, 03 Oct 2006 02:36:00 GMT</pubDate><guid>http://www.tkk7.com/zyl/archive/2006/10/03/73255.html</guid><wfw:comment>http://www.tkk7.com/zyl/comments/73255.html</wfw:comment><comments>http://www.tkk7.com/zyl/archive/2006/10/03/73255.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.tkk7.com/zyl/comments/commentRss/73255.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zyl/services/trackbacks/73255.html</trackback:ping><description><![CDATA[聽聽聽 JUnit 4 宸茬粡鍑烘潵寰堜箙浜嗭紝鍩烘湰涓婂緢澶歩de閮藉紑濮嬫敮鎸侊紝褰撶劧涓轟簡鍏煎鎬э紝涓鐩翠笉澶暍鐢ㄣ備互鍓嶉兘鏄噿寰楀啓鍗曞厓嫻嬭瘯錛屽ぇ澶氭暟鐨勬椂鍊欓兘鏄? System.out.print銆備笉榪囩幇鍦ㄥ凡緇忔槸嫻嬭瘯椹卞姩鐨勬椂浠d簡錛屼負浜嗕繚鎸佷竴涓壇濂界殑涔犳儻錛岃繕鏄渶瑕佸ソ濂界殑鍐欏啓鍗曞厓嫻嬭瘯銆傛柇璦榪滄瘮 System.out.print鏈夌敤銆?br /> 聽聽聽 鐪嬩簡鍑犵瘒鏂囩珷涔嬪悗錛屽JUnit4宸茬粡鏈変簡鍩烘湰鐨勬蹇典簡銆傚叾瀹炲緢澶氱壒鎬э紝testNg閮藉凡緇忓疄鐜頒簡錛屾尯璁ㄥ帉testNg鐨剎ml鏂囦歡錛屼笉榪噒estNg鐨勭伒媧繪ц繕鏄己澶э紝瀵逛簬澶ч潰縐殑緇勪歡嫻嬭瘯姣旇緝閫傚悎銆?br /> 聽聽聽 JUnit 4搴旇璇存槸浣跨敤鏂扮殑鏋舵瀯鍐欑殑錛屼嬌鐢ㄤ簡寰堝java5鐨勬柊鐗規(guī)с?br /> 聽聽聽 涓涓渶鍏抽敭鐨勬敼鍙橈紝嫻嬭瘯綾伙紝鍙互涓嶇敤緇ф壙閭h姝葷殑<span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">TestCase浜?嫻嬭瘯綾伙紝鍙互鏇村姞鐏墊椿錛屾柟娉曠殑瀹氫箟涓嶉渶瑕佸湪鍓嶉潰澧炲姞test浜嗐?br /> 聽聽聽 瀵逛簬嫻嬭瘯綾繪潵璇達紝鍙渶瑕佸仛浠ヤ笅綆鍗曠殑鍔ㄤ綔錛?br /> 聽聽聽 澧炲姞涓涓狜Test錛岀敤浜庢爣娉ㄧ浉搴旂殑嫻嬭瘯鏂規(guī)硶銆備嬌鐢ˋssert綾伙紝鏉ヨ繘琛屾柇璦銆?br /> 聽聽聽 </span><table class="MsoNormalTable" style="background: rgb(238, 238, 238) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" border="1" cellpadding="0" cellspacing="0" height="286" width="608"><tbody><tr style=""><td style="padding: 3.75pt;"><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">import org.junit.Assert;<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">public class AdditionTest {<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽 </span>private int x = 1;<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽 </span>private int y = 1;<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽 </span><font color="#ff0000">@Test </font>public void addition() {<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽聽聽 </span>int z = x + y;<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽聽聽 </span>Assert.assertEquals(2, z);<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽 </span>}<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">}<o:p></o:p></span></p></td></tr></tbody></table><br /> 褰撶劧鍙互浣跨敤java 5鐨剆tatic import 鍔熻兘<br /><table class="MsoNormalTable" style="background: rgb(238, 238, 238) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" border="1" cellpadding="0" cellspacing="0" height="292" width="609"><tbody><tr style=""><td style="padding: 3.75pt;"><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><font color="#ff3300">import static org.junit.Assert.*;</font><o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">public class AdditionTest {<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽 </span>private int x = 1;<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽 </span>private int y = 1;<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽 </span><font color="#ff3300">@</font><font color="#ff3300">Test </font>public void addition() {<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽聽聽 </span>int z = x + y;<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽聽聽 </span>assertEquals(2, z);<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽 </span>}<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">}<o:p></o:p></span></p></td></tr></tbody></table><br /> 瀵逛簬setUp 鍜宼earDown鏉ヨ錛屼互鍚庡彲浠ヤ笉鐢ㄥ啀緇ф壙榪欎袱涓柟娉曚簡銆傚彲浠ヤ嬌鐢ㄨ嚜瀹氫箟鐨勬柟娉曪紝鍙渶瑕佸湪鍓嶉潰澧炲姞@Before 鍜孈After 娉ㄩ噴鍗沖彲銆?br /><table class="MsoNormalTable" style="background: rgb(238, 238, 238) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" border="1" cellpadding="0" cellspacing="0" height="208" width="610"><tbody><tr style=""><td style="padding: 3.75pt;"><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><o:p>聽</o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">@<font color="#ff0000">Before </font>protected void initialize() {<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽聽聽 </span>System.setErr(new PrintStream(new ByteArrayOutputStream()));<o:p></o:p><span style="">聽聽 </span><o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽聽聽 </span>inputDir = new File("data");<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽聽聽 </span>inputDir = new File(inputDir, "xslt");<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽聽聽 </span>inputDir = new File(inputDir, "input");<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽聽聽聽聽聽聽 </span><o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">}<o:p></o:p></span></p></td></tr></tbody></table><br /><table class="MsoNormalTable" style="background: rgb(238, 238, 238) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" border="1" cellpadding="0" cellspacing="0" height="168" width="611"><tbody><tr style=""><td style="padding: 3.75pt;"><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><o:p>聽</o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><font color="#ff3300">@After</font> protected void disposeDocument() {<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽 </span>doc = null;<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽 </span>System.gc();<span style="">聽聽 </span><o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">} <o:p></o:p></span></p></td></tr></tbody></table><br /> 騫朵笖鍙互娉ㄩ噴澶氫釜鏂規(guī)硶銆?br /><br /> 聽聽聽 褰撶劧JUnit4 <span style="font-size: 12pt; font-family: 瀹嬩綋;">涔熷紩鍏ヤ簡涓涓?span lang="EN-US"> JUnit 3 </span>涓病鏈夌殑鏂扮壒鎬э細綾昏寖鍥寸殑 <span lang="EN-US">setUp() </span>鍜?<span lang="EN-US">tearDown() </span>鏂規(guī)硶銆備換浣曠敤 <span lang="EN-US">@BeforeClass </span>娉ㄩ噴鐨勬柟娉曢兘灝嗗湪璇ョ被涓殑嫻嬭瘯鏂規(guī)硶榪愯涔嬪墠鍒氬ソ榪愯涓嬈★紝鑰屼換浣曠敤 <span lang="EN-US">@AfterClass </span>娉ㄩ噴鐨勬柟娉曢兘灝嗗湪璇ョ被涓殑鎵鏈夋祴璇曢兘榪愯涔嬪悗鍒氬ソ榪愯涓嬈°?br /> 聽聽聽 </span><span style="font-size: 12pt; font-family: 瀹嬩綋;">渚?濡傦紝鍋囪綾諱腑鐨勬瘡涓祴璇曢兘浣跨敤涓涓暟鎹簱榪炴帴銆佷竴涓綉緇滆繛鎺ャ佷竴涓潪甯稿ぇ鐨勬暟鎹粨鏋勶紝鎴栬呰繕鏈変竴浜涘浜庡垵濮嬪寲鍜屼簨鎯呭畨鎺掓潵璇存瘮杈冩槀璐電殑鍏朵粬璧勬簮銆備笉瑕佸湪姣? 涓祴璇曚箣鍓嶉兘閲嶆柊鍒涘緩瀹冿紝鎮(zhèn)ㄥ彲浠ュ垱寤哄畠涓嬈★紝騫惰繕鍘熷畠涓嬈°傝鏂規(guī)硶灝嗕嬌寰楁湁浜涙祴璇曟渚嬭繍琛岃搗鏉ュ揩寰楀銆?br /><br /></span><table class="MsoNormalTable" style="background: rgb(238, 238, 238) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" border="1" cellpadding="0" cellspacing="0" height="418" width="606"><tbody><tr style=""><td style="padding: 3.75pt;"><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><o:p>聽</o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">// This class tests a lot of error conditions, which<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">// Xalan annoyingly logs to System.err. This hides System.err <o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">// before each test and restores it after each test.<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">private PrintStream systemErr;<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><font color="#ff3300">@BeforeClass</font> protected void redirectStderr() {<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽聽聽 </span>systemErr = System.err; // Hold on to the original value<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽聽聽 </span>System.setErr(new PrintStream(new ByteArrayOutputStream()));<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">}<o:p></o:p><span style="">聽</span><o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><font color="#ff0000">@AfterClass </font>protected void tearDown() {<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽聽聽 </span>// restore the original value<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽聽聽 </span>System.setErr(systemErr);<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">}<o:p></o:p></span></p></td></tr></tbody></table><br /><span style="font-size: 12pt; font-family: 瀹嬩綋;">聽聽聽 寮傚父嫻嬭瘯鏄?span lang="EN-US"> JUnit 4 </span>涓殑鏈澶ф敼榪涖傛棫寮忕殑寮傚父嫻嬭瘯鏄湪鎶涘嚭寮傚父鐨勪唬鐮佷腑鏀懼叆 <span lang="EN-US">try </span>鍧楋紝鐒跺悗鍦?<span lang="EN-US">try </span>鍧楃殑鏈熬鍔犲叆涓涓?<span lang="EN-US">fail() </span>璇彞銆?br /></span><span style="font-size: 12pt; font-family: 瀹嬩綋;">璇ユ柟娉曚笉浠呴毦鐪嬶紝鑰屼笖璇曞浘鎸戞垬浠g爜瑕嗙洊宸ュ叿錛屽洜涓轟笉綆℃祴璇曟槸閫氳繃榪樻槸澶辮觸錛屾繪湁涓浜涗唬鐮佷笉琚墽琛屻?/span><span style="font-size: 12pt; font-family: 瀹嬩綋;">鍦?span lang="EN-US"> JUnit 4 </span>涓紝鎮(zhèn)ㄧ幇鍦ㄥ彲浠ョ紪鍐欐姏鍑哄紓甯哥殑浠g爜錛屽茍浣跨敤娉ㄩ噴鏉ュ0鏄庤寮傚父鏄鏈熺殑錛? <br /></span><table class="MsoNormalTable" style="background: rgb(238, 238, 238) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" border="1" cellpadding="0" cellspacing="0" height="168" width="607"><tbody><tr style=""><td style="padding: 3.75pt;"><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><o:p>聽</o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><font color="#ff0000">@Test(expected=ArithmeticException.class)</font><o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽 </span>public void divideByZero() {<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽聽聽 </span>int n = 2 / 0;<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">}<o:p></o:p></span></p></td></tr></tbody></table><br /><span style="font-size: 12pt; font-family: 瀹嬩綋;">聽聽聽 濡傛灉璇ュ紓甯告病鏈夋姏鍑猴紙鎴栬呮姏鍑轟簡涓涓笉鍚岀殑寮傚父錛夛紝閭d箞嫻嬭瘯灝卞皢澶辮觸銆備絾鏄鏋滄?zhèn)ㄦ儗櫐亱箣璇曞紓甯哥殑璇l嗘秷鎭垨鍏朵粬灞炴э紝鍒欎粛鐒墮渶瑕佷嬌鐢ㄦ棫寮忕殑 <span lang="EN-US">try-catch </span>鏍峰紡銆?br /></span><a name="N101BE"><span style="font-size: 12pt; font-family: 瀹嬩綋;">聽聽聽 嫻嬭瘯鎬ц兘 鏄崟鍏冩祴璇曟渶涓虹棝鑻︾殑鏂歸潰涔嬩竴銆?span lang="EN-US">JUnit 4 </span>娌℃湁瀹屽叏瑙e喅榪欎釜闂錛屼絾鏄畠瀵硅繖涓棶棰樻湁鎵甯姪銆傛祴璇曞彲浠ョ敤涓涓秴鏃跺弬鏁版潵娉ㄩ噴銆傚鏋滄祴璇曡繍琛岀殑鏃墮棿瓚呰繃鎸囧畾鐨勬縐掓暟錛屽垯嫻嬭瘯澶辮觸銆?/span></a><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><o:p></o:p></span><br /><table class="MsoNormalTable" style="background: rgb(238, 238, 238) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" border="1" cellpadding="0" cellspacing="0" height="134" width="613"><tbody><tr style=""><td style="padding: 3.75pt;"><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><o:p>聽</o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">@Test(timeout=500) public void retrieveAllElementsInDocument() {<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽聽聽 </span>doc.query("http://*");<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">} <o:p></o:p></span></p></td></tr></tbody></table><br /> 鍩烘湰鐨勭壒鎬у氨榪欎箞澶氾紝榪欎簺鍔熻兘鍏跺疄閮藉彲浠ュ湪testNg涓壘鍒般備笉榪嘕Unit榪樻槸涓嶉敊鐨勶紝瀵逛簬鍗曞厓嫻嬭瘯鏉ヨ錛岃繖鏄閫夌殑銆?br /><br /> 褰撶劧涓轟簡鍏煎鎬э紝<span style="font-size: 12pt; font-family: 瀹嬩綋;">涓轟簡浣?span lang="EN-US"> JUnit 4 </span>嫻嬭瘯鍙互榪愯鍦?span lang="EN-US"> JUnit 3 </span>鐜涓紝鍙互灝嗗畠浠寘瑁呭湪 <span lang="EN-US">JUnit4TestAdapter </span>涓傚皢涓嬮潰鐨勬柟娉曟坊鍔犲埌鎮(zhèn)ㄧ殑<span lang="EN-US"> JUnit 4 </span>嫻嬭瘯綾諱腑搴旇灝辮凍澶熶簡錛?<span lang="EN-US"><o:p></o:p></span></span><br /><br /><table class="MsoNormalTable" style="background: rgb(238, 238, 238) none repeat scroll 0% 50%; width: 100%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" border="1" cellpadding="0" cellspacing="0" width="100%"><tbody><tr style=""><td style="padding: 3.75pt;"><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><o:p>聽</o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">public static junit.framework.Test suite() {<o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US"><span style="">聽 </span>return new JUnit4TestAdapter(AssertionTest.class);<span style="">聽聽聽 </span><o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 瀹嬩綋;" lang="EN-US">}<o:p></o:p></span></p></td></tr></tbody></table><br /><br /><img src ="http://www.tkk7.com/zyl/aggbug/73255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zyl/" target="_blank">甯冭。閮?/a> 2006-10-03 10:36 <a href="http://www.tkk7.com/zyl/archive/2006/10/03/73255.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>EasyMock 2 浣跨敤鎸囧崡http://www.tkk7.com/zyl/archive/2006/09/20/70897.html甯冭。閮?/dc:creator>甯冭。閮?/author>Wed, 20 Sep 2006 12:38:00 GMThttp://www.tkk7.com/zyl/archive/2006/09/20/70897.htmlhttp://www.tkk7.com/zyl/comments/70897.htmlhttp://www.tkk7.com/zyl/archive/2006/09/20/70897.html#Feedback1http://www.tkk7.com/zyl/comments/commentRss/70897.htmlhttp://www.tkk7.com/zyl/services/trackbacks/70897.html 鍏充簬鍗曞厓嫻嬭瘯錛屾ā鎷熷璞′竴鐩存槸涓嶅彲緙哄皯鐨勶紝灝ゅ叾瀵逛簬澶嶆潅鐨勫簲鐢ㄦ潵璇淬?br />聽聽聽聽聽聽 榪欎箞澶氱殑妯℃嫙瀵硅薄妗嗘灦涓紝涓漢瑙夊緱姣旇緝濂界敤鐨勫綋灞濫asyMock浜嗐傚綋鐒禞Mock涔熶笉閿欍?br />聽聽聽聽聽聽 涓嬮潰綆鍗曚粙緇嶄竴涓婨asyMock聽銆傦紙鍩烘湰緲昏瘧EasyMock鐨勬枃妗o紝鍙兘鏈変簺鍦版柟涓嶆槸寰堟伆褰擄級
聽聽聽聽聽
聽聽聽聽聽聽聽EasyMock 2
涓昏鐢ㄤ簬緇欐寚瀹氱殑鎺ュ彛鎻愪緵妯℃嫙瀵硅薄銆?/span>

妯℃嫙瀵硅薄鍙槸妯℃嫙棰嗗煙浠g爜鐩存帴鐨勯儴鍒嗚涓猴紝鑳芥嫻嬫槸鍚︿粬浠瀹氫箟涓殑琚嬌鐢ㄣ備嬌鐢?/span> Mock 瀵硅薄錛屾潵妯℃嫙鍚堜綔鎺ュ彛錛屾湁鍔╀簬闅旂嫻嬭瘯鐩稿簲鐨勯鍩熺被銆?/span>

鍒涘緩鍜岀淮鎸?/span> Mock 瀵硅薄緇忓父鏄箒鐞愮殑浠誨姟錛屽茍涓斿彲鑳戒細寮曞叆閿欒銆?/span> EasyMock 2 鍔ㄦ佷駭鐢?/span> Mock 瀵硅薄錛屼笉闇瑕佸垱寤猴紝騫朵笖涓嶄細浜х敓浠g爜銆?/span>

鏈夊埄鐨勬柟闈細

涓嶉渶瑕佹墜宸ュ啓綾繪潵澶勭悊 mock 瀵硅薄銆?/span>

鏀寔瀹夊叏鐨勯噸鏋?/span> Mock 瀵硅薄錛氭祴璇曚唬鐮佷笉浼氬湪榪愯鏈熸墦鏂綋閲嶆柊鍛藉悕鏂規(guī)硶鎴栬呮洿鏀規(guī)柟娉曞弬鏁般?/span>

鏀寔榪斿洖鍊煎拰渚嬪銆?/span>

鏀寔媯瀵熸柟娉曡皟鐢ㄦ搴忥紝瀵逛簬涓涓垨鑰呭涓?/span> Mock 瀵硅薄銆?/span>

涓嶅埄鐨勬柟闈細 2.0 浠呬嬌鐢ㄤ簬 java 2 鐗堟湰 5.0 鎴栬呬互涓?/font>
聽聽聽聽

聽聽聽 浠ヤ竴涓緥瀛愭潵璇存槑濡備綍浣跨敤EasyMock:
聽聽聽鍋囪鏈変竴涓悎浣滄帴鍙?span style="font-size: 10.5pt; color: black;" lang="EN-US">Collaborator錛?br />聽聽聽聽聽聽聽聽聽聽聽
package org.easymock.samples;
public interface Collaborator {
聽聽聽 void documentAdded(String title);
聽聽聽 void documentChanged(String title);
聽聽聽 void documentRemoved(String title);
聽聽聽 byte voteForRemoval(String title);
聽聽聽 byte[] voteForRemovals(String[] title);
}

鎴戜滑涓昏鐨勬祴璇曠被涓猴細
package org.easymock.samples;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class ClassUnderTest {
聽聽聽 private Set<Collaborator> listeners = new HashSet<Collaborator>();
聽聽聽 private Map<String, byte[]> documents = new HashMap<String, byte[]>();
聽聽聽 public void addListener(Collaborator listener) {
聽聽聽聽聽聽聽 listeners.add(listener);
聽聽聽 }
聽聽聽 public void addDocument(String title, byte[] document) {
聽聽聽聽聽聽聽 boolean documentChange = documents.containsKey(title);
聽聽聽聽聽聽聽 documents.put(title, document);
聽聽聽聽聽聽聽 if (documentChange) {
聽聽聽聽聽聽聽聽聽聽聽 notifyListenersDocumentChanged(title);
聽聽聽聽聽聽聽 } else {
聽聽聽聽聽聽聽聽聽聽聽 notifyListenersDocumentAdded(title);
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽 public boolean removeDocument(String title) {
聽聽聽聽聽聽聽 if (!documents.containsKey(title)) {
聽聽聽聽聽聽聽聽聽聽聽 return true;
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 if (!listenersAllowRemoval(title)) {
聽聽聽聽聽聽聽聽聽聽聽 return false;
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 documents.remove(title);
聽聽聽聽聽聽聽 notifyListenersDocumentRemoved(title);
聽聽聽聽聽聽聽 return true;
聽聽聽 }
聽聽聽 public boolean removeDocuments(String[] titles) {
聽聽聽聽聽聽聽 if (!listenersAllowRemovals(titles)) {
聽聽聽聽聽聽聽聽聽聽聽 return false;
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 for (String title : titles) {
聽聽聽聽聽聽聽聽聽聽聽 documents.remove(title);
聽聽聽聽聽聽聽聽聽聽聽 notifyListenersDocumentRemoved(title);
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 return true;
聽聽聽 }
聽聽聽 private void notifyListenersDocumentAdded(String title) {
聽聽聽聽聽聽聽 for (Collaborator listener : listeners) {
聽聽聽聽聽聽聽聽聽聽聽 listener.documentAdded(title);
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽 private void notifyListenersDocumentChanged(String title) {
聽聽聽聽聽聽聽 for (Collaborator listener : listeners) {
聽聽聽聽聽聽聽聽聽聽聽 listener.documentChanged(title);
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽 private void notifyListenersDocumentRemoved(String title) {
聽聽聽聽聽聽聽 for (Collaborator listener : listeners) {
聽聽聽聽聽聽聽聽聽聽聽 listener.documentRemoved(title);
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽 private boolean listenersAllowRemoval(String title) {
聽聽聽聽聽聽聽 int result = 0;
聽聽聽聽聽聽聽 for (Collaborator listener : listeners) {
聽聽聽聽聽聽聽聽聽聽聽 result += listener.voteForRemoval(title);
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 return result > 0;
聽聽聽 }
聽聽聽 private boolean listenersAllowRemovals(String[] titles) {
聽聽聽聽聽聽聽 int result = 0;
聽聽聽聽聽聽聽 for (Collaborator listener : listeners) {
聽聽聽聽聽聽聽聽聽聽聽 result += listener.voteForRemovals(titles);
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 return result > 0;
聽聽聽 }
}

絎竴涓?/span>Mock 瀵硅薄

鎴戜滑灝嗗垱寤?/span>test case 騫朵笖鍥寸粫姝ょ悊瑙g浉鍏崇殑EasyMock 鍖呯殑鍔熻兘銆傜涓涓祴璇曟柟娉曪紝鐢ㄤ簬媯嫻嬫槸鍚﹀垹闄や竴涓笉瀛樺湪鐨勬枃妗o紝涓嶄細鍙戦氱煡緇欏悎浣滅被銆?br />聽聽聽聽聽聽聽聽聽聽
package org.easymock.samples;
import junit.framework.TestCase;
public class ExampleTest extends TestCase {
聽聽聽 private ClassUnderTest classUnderTest;
聽聽聽 private Collaborator mock;
聽聽聽 protected void setUp() {
聽聽聽聽聽聽聽 classUnderTest = new ClassUnderTest();
聽聽聽聽聽聽聽 classUnderTest.addListener(mock);
聽聽聽 }
聽聽聽 public void testRemoveNonExistingDocument() {聽聽聽 
聽聽聽聽聽聽聽聽// This call should not lead to any notification
聽聽聽聽 聽聽聽// of the Mock Object: 
聽聽聽聽聽聽聽聽classUnderTest.removeDocument("Does not exist");
聽聽聽 }
}
聽聽聽聽瀵逛簬澶氭暟嫻嬭瘯綾伙紝浣跨敤EasyMock 2,鎴戜滑鍙渶瑕侀潤鎬佸紩鍏?/span>org.easymock.EasyMock鐨勬柟娉曘?/span>聽聽聽聽聽聽

import static org.easymock.EasyMock.*;

import junit.framework.TestCase;

public class ExampleTest extends TestCase {

聽聽聽 private ClassUnderTest classUnderTest;

聽聽聽 private Collaborator mock;

聽聽聽

}

聽聽聽聽聽

涓轟簡鍙栧緱Mock 瀵硅薄錛岄渶瑕侊細

l聽聽聽聽聽聽聽聽 鍒涘緩Mock 瀵硅薄浠庨渶瑕佹ā鎷熺殑鎺ュ彛

l聽聽聽聽聽聽聽聽 璁板綍鏈熷緟鐨勮涓?/span>

l聽聽聽聽聽聽聽聽 杞崲鍒?/span>Mock瀵硅薄錛?/span>replay鐘舵併?/span>

渚嬪錛?/span>聽聽聽聽聽
protected void setUp() {
聽聽聽 聽聽聽聽mock = createMock(Collaborator.class); // 1
聽聽聽聽聽聽聽 classUnderTest = new ClassUnderTest();
聽聽聽聽聽聽聽 classUnderTest.addListener(mock);
聽聽聽 }

public void testRemoveNonExistingDocument() {
聽聽聽聽聽聽聽 // 2 (we do not expect anything)
聽聽聽聽聽聽聽 replay(mock); // 3
聽聽聽聽聽聽聽 classUnderTest.removeDocument("Does not exist");
聽聽聽 }
聽聽

鍦ㄦ墽琛岀涓夋鍚庯紝mock 涓?/span>Collaborator鎺ュ彛鐨?/span>Mock瀵硅薄錛屽茍涓旀湡寰呮病鏈変粈涔堣皟鐢ㄣ傝繖灝辨剰鍛崇潃錛屽鏋滄垜浠敼鍙?/span>ClassUnderTest鍘昏皟鐢ㄦ鎺ュ彛鐨勪換浣曟柟娉曪紝鍒?/span>Mock瀵硅薄浼氭姏鍑?/span>AssertionError錛?/span>

聽聽聽聽聽聽聽聽
java.lang.AssertionError: 
聽聽Unexpected method call documentRemoved("Does not exist"):
聽聽聽 at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:29)
聽聽聽 at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:44)
聽聽聽 at $Proxy0.documentRemoved(Unknown Source)
聽聽聽 at org.easymock.samples.ClassUnderTest.notifyListenersDocumentRemoved(ClassUnderTest.java:74)
聽聽聽 at org.easymock.samples.ClassUnderTest.removeDocument(ClassUnderTest.java:33)
聽聽聽 at org.easymock.samples.ExampleTest.testRemoveNonExistingDocument(ExampleTest.java:24)
聽聽聽 ...

澧炲姞琛屼負

聽聽聽聽聽聽 璁╂垜浠紑濮嬬浜屼釜嫻嬭瘯銆傚鏋?/span>document琚?/span>classUnderTest澧炲姞錛屾垜浠湡寰呰皟鐢?/span>
mock.documentAdded()鍦?span lang="EN-US">Mock瀵硅薄浣跨敤document鐨勬爣棰樹綔涓哄弬鏁幫細

public void testAddDocument() {
聽聽聽聽聽聽 mock.documentAdded("New Document"); // 2
聽聽聽聽聽聽聽 replay(mock); // 3
聽聽聽聽聽聽聽 classUnderTest.addDocument("New Document", new byte[0]); 
聽聽聽聽}
濡傛灉classUnderTest.addDocument("New Document", new byte[0])璋冪敤鏈熷緟鐨勬柟娉曪紝浣跨敤閿欒鐨勫弬鏁幫紝Mock瀵硅薄浼氭姏鍑?span lang="EN-US">AssertionError:

java.lang.AssertionError: 
聽聽Unexpected method call documentAdded("Wrong title"):
聽聽聽 documentAdded("New Document"): expected: 1, actual: 0
聽聽聽 at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:29)
聽聽聽 at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:44)
聽聽聽 at $Proxy0.documentAdded(Unknown Source)
聽聽聽 at org.easymock.samples.ClassUnderTest.notifyListenersDocumentAdded(ClassUnderTest.java:61)
聽聽聽 at org.easymock.samples.ClassUnderTest.addDocument(ClassUnderTest.java:28)
聽聽聽 at org.easymock.samples.ExampleTest.testAddDocument(ExampleTest.java:30)
聽聽聽 ...

鍚屾牱錛屽鏋滆皟鐢ㄥ嬈℃鏂規(guī)硶錛屽垯涔熶細鎶涘嚭渚嬪錛?/span>

java.lang.AssertionError: 
聽聽Unexpected method call documentAdded("New Document"):
聽聽聽 documentAdded("New Document"): expected: 1, actual: 1 (+1)
聽聽聽 at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:29)
聽聽聽 at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:44)
聽聽聽 at $Proxy0.documentAdded(Unknown Source)
聽聽聽 at org.easymock.samples.ClassUnderTest.notifyListenersDocumentAdded(ClassUnderTest.java:62)
聽聽聽 at org.easymock.samples.ClassUnderTest.addDocument(ClassUnderTest.java:29)
聽聽聽 at org.easymock.samples.ExampleTest.testAddDocument(ExampleTest.java:30)
聽聽聽 ...

楠岃瘉琛屼負

聽聽聽聽聽聽 褰撴垜浠寚瀹氳涓哄悗錛屾垜浠皢楠岃瘉瀹為檯鍙戠敓鐨勩傚綋鍓嶇殑嫻嬭瘯灝嗕細鍒ゆ柇鏄惁Mock瀵硅薄浼氱湡瀹炶皟鐢ㄣ傚彲浠ヨ皟鐢?/span>verify(mock)鏉ュ北姝f槸鍚︽寚瀹氱殑琛屼負琚皟鐢ㄣ?/span>

public void testAddDocument() {
聽聽聽聽聽聽聽 mock.documentAdded("New Document"); // 2 
聽聽聽聽聽聽聽聽replay(mock); // 3
聽聽聽聽聽聽聽 classUnderTest.addDocument("New Document", new byte[0]);
聽聽聽聽聽聽 verify(mock);
聽聽聽 }

濡傛灉澶辮觸錛屽垯鎶涘嚭AssertionError

鏈熷緟鏄庢樉鏁伴噺鐨勮皟鐢?/span>

鍒扮幇鍦紝鎴戜滑鐨勬祴璇曞彧鏄皟鐢ㄤ竴涓畝鍗曠殑鏂規(guī)硶銆備笅涓涓祴璇曞皢浼氭嫻嬫槸鍚﹀凡緇忓瓨鍦?/span>document瀵艱嚧mock.documentChanged()璋冪敤銆備負浜嗙‘璁わ紝璋冪敤涓夋

public void testAddAndChangeDocument() {
聽聽聽聽聽聽聽 mock.documentAdded("Document");
聽聽聽聽聽聽聽 mock.documentChanged("Document");
聽聽聽聽聽聽聽 mock.documentChanged("Document");
聽聽聽聽聽聽聽 mock.documentChanged("Document");
聽聽聽聽聽聽聽 replay(mock);
聽聽聽聽聽聽聽 classUnderTest.addDocument("Document", new byte[0]);
聽聽聽聽聽聽聽 classUnderTest.addDocument("Document", new byte[0]);
聽聽聽聽聽聽聽 classUnderTest.addDocument("Document", new byte[0]);
聽聽聽聽聽聽聽 classUnderTest.addDocument("Document", new byte[0]);
聽聽聽聽聽聽聽 verify(mock);
聽聽聽 }

涓轟簡閬垮厤閲嶅鐨?/span>mock.documentChanged("Document"),EasyMock鎻愪緵涓涓揩鎹鋒柟寮忋傚彲浠ラ氳繃璋冪敤鏂規(guī)硶expectLastCall().times(int times)鏉ユ寚瀹氭渶鍚庝竴嬈¤皟鐢ㄧ殑嬈℃暟銆?/span>

public void testAddAndChangeDocument() {
聽聽聽聽聽聽聽 mock.documentAdded("Document");
聽聽聽聽聽聽聽 mock.documentChanged("Document");
聽聽聽聽聽聽聽 expectLastCall().times(3);
聽聽聽聽聽聽聽 replay(mock);
聽聽聽聽聽聽聽 classUnderTest.addDocument("Document", new byte[0]);
聽聽聽聽聽聽聽 classUnderTest.addDocument("Document", new byte[0]);
聽聽聽聽聽聽聽 classUnderTest.addDocument("Document", new byte[0]);
聽聽聽聽聽聽聽 classUnderTest.addDocument("Document", new byte[0]);
聽聽聽聽聽聽聽 verify(mock);
聽聽聽 }

鎸囧畾榪斿洖鍊?/span>

聽聽聽聽聽聽 瀵逛簬鎸囧畾榪斿洖鍊鹼紝鎴戜滑閫氳繃灝佽expect(T value)榪斿洖鐨勫璞″茍涓旀寚瀹氳繑鍥炵殑鍊鹼紝浣跨敤鏂規(guī)硶andReturn(Object returnValue)浜?span lang="EN-US">expect(T value).榪斿洖鐨勫璞°?/span>

渚嬪錛?/span>

public void testVoteForRemoval() {
聽聽聽聽聽聽聽 mock.documentAdded("Document");聽聽 // expect document addition
聽聽聽聽聽聽聽 // expect to be asked to vote for document removal, and vote for it
聽聽聽聽聽聽聽 expect(mock.voteForRemoval("Document")).andReturn((byte) 42);
聽聽聽聽聽聽聽 mock.documentRemoved("Document"); // expect document removal
聽聽聽聽聽聽聽 replay(mock);
聽聽聽聽聽聽聽 classUnderTest.addDocument("Document", new byte[0]);
聽聽聽聽聽聽聽 assertTrue(classUnderTest.removeDocument("Document"));
聽聽聽聽聽聽聽 verify(mock);
聽聽聽 } 
聽聽聽 public void testVoteAgainstRemoval() {
聽聽聽聽聽聽聽 mock.documentAdded("Document");聽聽 // expect document addition
聽聽聽聽聽聽聽 // expect to be asked to vote for document removal, and vote against it
聽聽聽聽聽聽聽 expect(mock.voteForRemoval("Document")).andReturn((byte) -42);
聽聽聽聽聽聽聽 replay(mock);
聽聽聽聽聽聽聽 classUnderTest.addDocument("Document", new byte[0]);
聽聽聽聽聽聽聽 assertFalse(classUnderTest.removeDocument("Document"));
聽聽聽聽聽聽verify(mock);
聽聽聽 }
鍙栦唬expect(T value)璋冪敤錛屽彲浠ラ氳繃expectLastCall().鏉ヤ唬鏇?/span>
expect(mock.voteForRemoval("Document")).andReturn((byte) 42);

絳夊悓浜?/span>

mock.voteForRemoval("Document");
expectLastCall().andReturn((byte) 42);

澶勭悊渚嬪

瀵逛簬鎸囧畾鐨勪緥澶?/span>(鏇寸‘鍒囩殑:Throwables)琚姏鍑猴紝鐢?/span>expectLastCall()鍜?span lang="EN-US">expect(T value)榪斿洖鐨勫璞★紝鎻愪緵浜嗘柟娉?/span>andThrow(Throwable throwable)銆傛柟娉曚笉寰椾笉琚皟鐢ㄨ褰曠姸鎬侊紝鍦ㄨ皟鐢?span lang="EN-US">Mock瀵硅薄鍚庯紝瀵逛簬姝ゆ寚瀹氫簡瑕佹姏鍑虹殑Throwable銆?span lang="EN-US">


鍩烘湰鐨勬柟娉曪紝宸茬粡璇村畬浜嗭紝褰撶劧榪欎笉鑳藉畬鍏ㄨ鏄嶦asyMock鐨勪嬌鐢ㄣ傛洿澶氱殑鍥犵礌璇峰弬鑰僂asyMock鐨勬枃妗?br />http://www.easymock.org/Documentation.html


]]>
主站蜘蛛池模板: a级毛片无码免费真人久久| 亚洲成人高清在线观看| 在线播放亚洲精品| 免费一级毛片无毒不卡| 日日噜噜噜噜夜夜爽亚洲精品| 国产精品亚洲精品日韩动图| 国产一区二区三区免费在线观看| 亚洲乱亚洲乱妇24p| 日韩a级毛片免费观看| 亚洲日本VA午夜在线电影| 欧洲精品免费一区二区三区| 美女羞羞免费视频网站| 亚洲国产成人精品久久久国产成人一区二区三区综 | 免费看男人j放进女人j免费看| 国产亚洲高清不卡在线观看| baoyu122.永久免费视频| 亚洲最大成人网色| 久久久久国色AV免费观看性色| 亚洲人成图片网站| 免费一级毛片免费播放| 中文永久免费观看网站| 亚洲黄色免费电影| 国产裸模视频免费区无码| 你懂的免费在线观看| 亚洲精品在线播放视频| 在线观看免费亚洲| 国内精品免费久久影院| 亚洲色图校园春色| 亚洲av高清在线观看一区二区| 国产婷婷成人久久Av免费高清 | 无码日韩人妻av一区免费| 亚洲av乱码一区二区三区 | 又黄又爽一线毛片免费观看| 国产线视频精品免费观看视频| 亚洲一级毛片视频| 中文字幕亚洲一区二区三区 | 免费国产草莓视频在线观看黄| 亚洲成AV人片在线观看无码 | 插B内射18免费视频| 三级毛片在线免费观看| 亚洲中文字幕无码一去台湾|