ʹÓÃEasyMock¸üÇáËɵؽøÐвâÊÔ

·¢±íÓÚ£º2014-7-10 10:45

×ÖÌ壺´ó ÖРС | ÉÏһƪ | ÏÂһƪ | ÎÒҪͶ¸å

 ×÷ÕߣºElliotte Rusty Harol    À´Ô´£º51TestingÈí¼þ²âÊÔÍø²É±à

¡¡¡¡Currency ÀàÉè¼ÆµÄһЩÖصã¿ÉÄܲ»ÈÝÒ×Ò»ÏÂ×Ó¿´³öÀ´¡£»ãÂÊÊÇ´ÓÕâ¸öÀàÖ®Íâ ´«µÝ½øÀ´µÄ£¬²¢²»ÊÇÔÚÀàÄÚ²¿¹¹ÔìµÄ¡£Òò´Ë£¬ºÜÓбØҪΪ»ãÂÊ´´½¨ mock£¬ÕâÑùÔÚÔËÐвâÊÔʱ¾Í²»ÐèÒªÓëÕæÕýµÄ»ãÂÊ·þÎñÆ÷ͨÐÅ¡£Õ⻹ʹ¿Í»§»úÓ¦ÓóÌÐòÄܹ»Ê¹Óò»Í¬µÄ»ãÂÊÊý¾ÝÔ´¡£
¡¡¡¡Çåµ¥ 3 ¸ø³öÒ»¸ö JUnit ²âÊÔ£¬Ëü¼ì²éÔÚ»ãÂÊΪ 1.5 µÄÇé¿öÏ $2.50 ÊÇ·ñ»áת»»Îª €3.75¡£Ê¹Óà EasyMock ´´½¨Ò»¸ö×ÜÊÇÌṩֵ 1.5 µÄExchangeRate ¶ÔÏó¡£
¡¡¡¡Çåµ¥ 3. CurrencyTest Àà
import junit.framework.TestCase;
import org.easymock.EasyMock;
import java.io.IOException;
public class CurrencyTest extends TestCase {
public void testToEuros() throws IOException {
Currency expected = new Currency(3.75, "EUR");
ExchangeRate mock = EasyMock.createMock(ExchangeRate.class);
EasyMock.expect(mock.getRate("USD", "EUR")).andReturn(1.5);
EasyMock.replay(mock);
Currency actual = testObject.toEuros(mock);
assertEquals(expected, actual);
}
}
¡¡¡¡ÀÏʵ˵£¬ÔÚÎÒµÚÒ»´ÎÔËÐÐ Çåµ¥ 3 ʱʧ°ÜÁË£¬²âÊÔÖо­³£³öÏÖÕâÖÖÎÊÌâ¡£µ«ÊÇ£¬ÎÒÒѾ­¾ÀÕýÁË bug¡£Õâ¾ÍÊÇÎÒÃDzÉÓà TDD µÄÔ­Òò¡£
¡¡¡¡ÔËÐÐÕâ¸ö²âÊÔ£¬Ëüͨ¹ýÁË¡£·¢ÉúÁËʲô£¿ÎÒÃÇÀ´ÖðÐп´¿´Õâ¸ö²âÊÔ¡£Ê×ÏÈ£¬¹¹Ôì²âÊÔ¶ÔÏóºÍÔ¤ÆڵĽá¹û£º
¡¡¡¡Currency testObject = new Currency(2.50, "USD");
¡¡¡¡Currency expected = new Currency(3.75, "EUR");
¡¡¡¡Õâ²»ÊÇж«Î÷¡£
¡¡¡¡½ÓÏÂÀ´£¬Í¨¹ý°Ñ ExchangeRate ½Ó¿ÚµÄ Class ¶ÔÏ󴫵ݸø¾²Ì¬µÄ EasyMock.createMock() ·½·¨£¬´´½¨Õâ¸ö½Ó¿ÚµÄ mock °æ±¾£º
¡¡¡¡ExchangeRate mock = EasyMock.createMock(ExchangeRate.class);
¡¡¡¡ÕâÊǵ½Ä¿Ç°ÎªÖ¹×î²»¿É˼ÒéµÄ²¿·Ö¡£×¢Ò⣬ÎÒ¿ÉûÓбàдʵÏÖ ExchangeRate ½Ó¿ÚµÄÀà¡£ÁíÍ⣬EasyMock.createMock() ·½·¨¾ø¶ÔÎÞ·¨·µ»ØExchangeRate µÄʵÀý£¬Ëü¸ù±¾²»ÖªµÀÕâ¸öÀàÐÍ£¬Õâ¸öÀàÐÍÊÇÎÒΪ±¾ÎÄ´´½¨µÄ¡£¼´Ê¹ËüÄܹ»Í¨¹ýijÖÖÆæ¼£·µ»Ø ExchangeRate£¬µ«ÊÇÈç¹ûÐèҪģÄâÁíÒ»¸ö½Ó¿ÚµÄʵÀý£¬ÓÖ»áÔõôÑùÄØ£¿
¡¡¡¡ÎÒ×î³õ¿´µ½Õâ¸öʱҲ·Ç³£À§»ó¡£ÎÒ²»ÏàÐÅÕâ¶Î´úÂëÄܹ»±àÒ룬µ«ÊÇËüȷʵ¿ÉÒÔ¡£ÕâÀïµÄ ¡°ºÚħ·¨¡± À´×Ô Java 1.3 ÖÐÒýÈëµÄ Java 5 ·ºÐͺͶ¯Ì¬´úÀí£¨¼û ²Î¿¼×ÊÁÏ£©¡£ÐÒÔ˵ÄÊÇ£¬Äú²»ÐèÒªÁ˽âËüµÄ¹¤×÷·½Ê½£¨·¢Ã÷ÕâЩ¾÷ÇϵijÌÐòԱȷʵ·Ç³£´ÏÃ÷£©¡£
¡¡¡¡ÏÂÒ»²½Í¬ÑùÁîÈ˳Ծª¡£ÎªÁ˸æËß mock ÆÚÍûʲô½á¹û£¬°Ñ·½·¨×÷Ϊ²ÎÊý´«µÝ¸ø EasyMock.expect() ·½·¨¡£È»ºóµ÷Óà andReturn() Ö¸¶¨µ÷ÓÃÕâ¸ö·½·¨Ó¦¸ÃµÃµ½Ê²Ã´½á¹û£º
¡¡¡¡EasyMock.expect(mock.getRate("USD", "EUR")).andReturn(1.5);
¡¡¡¡EasyMock ¼Ç¼Õâ¸öµ÷Óã¬Òò´ËÖªµÀÒÔºóÓ¦¸ÃÖØ·Åʲô¡£
¡¡¡¡Èç¹ûÔÚʹÓà mock ֮ǰÍüÁ˵÷Óà EasyMock.replay()£¬ÄÇô»á³öÏÖ IllegalStateException Òì³£ºÍÒ»¸öûÓÐʲô°ïÖúµÄ´íÎóÏûÏ¢£ºmissing behavior definition for the preceding method call¡£
¡¡¡¡½ÓÏÂÀ´£¬Í¨¹ýµ÷Óà EasyMock.replay() ·½·¨£¬Èà mock ×¼±¸ÖطżÇ¼µÄÊý¾Ý£º
¡¡¡¡EasyMock.replay(mock);
¡¡¡¡ÕâÊÇÈÃÎұȽÏÀ§»óµÄÉè¼ÆÖ®Ò»¡£EasyMock.replay() ²»»áʵ¼ÊÖØ·Å mock¡£¶øÊÇÖØÐÂÉèÖà mock£¬ÔÚÏÂÒ»´Îµ÷ÓÃËüµÄ·½·¨Ê±£¬Ëü½«¿ªÊ¼ÖØ·Å¡£
¡¡¡¡ÏÖÔÚ mock ×¼±¸ºÃÁË£¬ÎÒ°ÑËü×÷Ϊ²ÎÊý´«µÝ¸øÒª²âÊԵķ½·¨£º
¡¡¡¡ÎªÀà´´½¨ mock
¡¡¡¡´ÓʵÏֵĽǶÈÀ´¿´£¬ºÜÄÑΪÀà´´½¨ mock¡£²»ÄÜΪÀà´´½¨¶¯Ì¬´úÀí¡£±ê×¼µÄ EasyMock ¿ò¼Ü²»Ö§³ÖÀàµÄ mock¡£µ«ÊÇ£¬EasyMock ÀàÀ©Õ¹Ê¹ÓÃ×Ö½ÚÂë²Ù×÷²úÉúÏàͬµÄЧ¹û¡£ÄúµÄ´úÂëÖвÉÓõÄģʽ¼¸ºõÍêÈ«Ò»Ñù¡£Ö»Ðèµ¼Èëorg.easymock.classextension.EasyMock ¶ø²»ÊÇorg.easymock.EasyMock¡£ÎªÀà´´½¨ mock ÔÊÐí°ÑÀàÖеÄÒ»²¿·Ö·½·¨Ì滻Ϊ mock£¬¶øÆäËû·½·¨±£³Ö²»±ä¡£
¡¡¡¡Currency actual = testObject.toEuros(mock);
¡¡¡¡×îºó£¬¼ì²é½á¹ûÊÇ·ñ·ûºÏÔ¤ÆÚ£º
¡¡¡¡assertEquals(expected, actual);
¡¡¡¡Õâ¾ÍÍê³ÉÁË¡£Èç¹ûÓÐÒ»¸öÐèÒª·µ»ØÌض¨ÖµµÄ½Ó¿ÚÐèÒª²âÊÔ£¬¾Í¿ÉÒÔ¿ìËٵش´½¨Ò»¸ö mock¡£ÕâȷʵºÜÈÝÒס£ExchangeRate ½Ó¿ÚºÜСºÜ¼òµ¥£¬ºÜÈÝÒ×ΪËüÊÖ¹¤±àд mock Àà¡£µ«ÊÇ£¬½Ó¿ÚÔ½´óÔ½¸´ÔÓ£¬¾ÍÔ½ÄÑΪÿ¸öµ¥Ôª²âÊÔ±àдµ¥¶ÀµÄ mock¡£Í¨¹ýʹÓà EasyMock£¬Ö»ÐèÒ»ÐдúÂë¾ÍÄܹ»´´½¨ java.sql.ResultSet »ò org.xml.sax.ContentHandler ÕâÑùµÄ´óÐͽӿڵÄʵÏÖ£¬È»ºóÏòËüÃÇÌṩÔËÐвâÊÔËùÐèµÄÐÐΪ¡£
¡¡¡¡²âÊÔÒì³£
¡¡¡¡mock ×î³£¼ûµÄÓÃ;֮һÊDzâÊÔÒì³£Ìõ¼þ¡£ÀýÈ磬ÎÞ·¨¼ò±ãµØ¸ù¾ÝÐèÒªÖÆÔìÍøÂç¹ÊÕÏ£¬µ«ÊÇ¿ÉÒÔ´´½¨Ä£ÄâÍøÂç¹ÊÕ쵀 mock¡£
¡¡¡¡µ± getRate() Å׳ö IOException ʱ£¬Currency ÀàÓ¦¸Ã·µ»Ø null¡£Çåµ¥ 4 ²âÊÔÕâÒ»µã£º
¡¡¡¡Çåµ¥ 4. ²âÊÔ·½·¨ÊÇ·ñÅ׳öÕýÈ·µÄÒì³£
public void testExchangeRateServerUnavailable() throws IOException {
ExchangeRate mock = EasyMock.createMock(ExchangeRate.class);
EasyMock.expect(mock.getRate("USD", "EUR")).andThrow(new IOException());
EasyMock.replay(mock);
Currency actual = testObject.toEuros(mock);
assertNull(actual);
}
¡¡¡¡ÕâÀïµÄж«Î÷ÊÇ andThrow() ·½·¨¡£¹ËÃû˼Ò壬ËüÖ»ÊÇÈà getRate() ·½·¨ÔÚ±»µ÷ÓÃʱÅ׳öÖ¸¶¨µÄÒì³£¡£
¡¡¡¡¿ÉÒÔÅ׳öÄúÐèÒªµÄÈκÎÀàÐ͵ÄÒì³££¨ÒѼì²é¡¢ÔËÐÐʱ»ò´íÎ󣩣¬Ö»Òª·½·¨Ç©ÃûÖ§³ÖËü¼´¿É¡£Õâ¶ÔÓÚ²âÊÔ¼«ÆäÉÙ¼ûµÄÌõ¼þ£¨ÀýÈçÄÚ´æºÄ¾¡´íÎó»òÎÞ·¨ÕÒµ½ÀඨÒ壩»ò±íʾÐéÄâ»ú bug µÄÌõ¼þ£¨±ÈÈç UTF-8 ×Ö·û±àÂë²»¿ÉÓã©ÓÈÆäÓаïÖú¡£
¡¡¡¡ÉèÖÃÔ¤ÆÚ
¡¡¡¡EasyMock ²»Ö»ÊÇÄܹ»Óù̶¨µÄ½á¹ûÏìÓ¦¹Ì¶¨µÄÊäÈë¡£Ëü»¹¿ÉÒÔ¼ì²éÊäÈëÊÇ·ñ·ûºÏÔ¤ÆÚ¡£ÀýÈ磬¼ÙÉè toEuros() ·½·¨ÓÐÒ»¸ö bug£¨¼ûÇåµ¥ 5£©£¬Ëü·µ»ØÒÔŷԪΪµ¥Î»µÄ½á¹û£¬µ«ÊÇ»ñÈ¡µÄÊǼÓÄôóÔªµÄ»ãÂÊ¡£Õâ»áÈÿͻ§·¢Ò»±ÊÒâÍâÖ®²Æ»òÔâÊÜÖØ´óËðʧ¡£
¡¡¡¡Çåµ¥ 5. ÓÐ bug µÄ toEuros() ·½·¨
public Currency toEuros(ExchangeRate converter) {
if ("EUR".equals(units)) return this;
else {
double input = amount + cents/100.0;
double rate;
try {
rate = converter.getRate(units, "CAD");
double output = input * rate;
return new Currency(output, "EUR");
} catch (IOException e) {
return null;
}
}
}
¡¡¡¡µ«ÊÇ£¬²»ÐèҪΪ´Ë±àдÁíÒ»¸ö²âÊÔ¡£Çåµ¥ 4 ÖÐµÄ testToEuros Äܹ»²¶×½µ½Õâ¸ö bug¡£µ±¶ÔÕâ¶Î´úÂëÔËÐÐÇåµ¥ 4 ÖеIJâÊÔʱ£¬²âÊÔ»áʧ°Ü²¢ÏÔʾÒÔÏ´íÎóÏûÏ¢£º
¡¡¡¡"java.lang.AssertionError:
¡¡¡¡Unexpected method call getRate("USD", "CAD"):
¡¡¡¡getRate("USD", "EUR"): expected: 1, actual: 0".
¡¡¡¡×¢Ò⣬Õâ²¢²»ÊÇÎÒÉèÖõĶÏÑÔ¡£EasyMock ×¢Òâµ½ÎÒ´«µÝµÄ²ÎÊý²»·ûºÏ²âÊÔÓÃÀý¡£
¡¡¡¡ÔÚĬÈÏÇé¿öÏ£¬EasyMock Ö»ÔÊÐí²âÊÔÓÃÀýÓÃÖ¸¶¨µÄ²ÎÊýµ÷ÓÃÖ¸¶¨µÄ·½·¨¡£µ«ÊÇ£¬ÓÐʱºòÕâÓеã¶ùÌ«ÑϸñÁË£¬ËùÒÔÓа취·Å¿íÕâÒ»ÏÞÖÆ¡£ÀýÈ磬¼ÙÉèÏ£ÍûÔÊÐí°ÑÈκÎ×Ö·û´®´«µÝ¸ø getRate() ·½·¨£¬¶ø²»½öÏÞÓÚ USD ºÍ EUR¡£ÄÇô£¬¿ÉÒÔÖ¸¶¨ EasyMock.anyObject() ¶ø²»ÊÇÏÔʽµÄ×Ö·û´®£¬ÈçÏÂËùʾ£º
¡¡¡¡EasyMock.expect(mock.getRate(
¡¡¡¡(String) EasyMock.anyObject(),
¡¡¡¡(String) EasyMock.anyObject())).andReturn(1.5);
¡¡¡¡»¹¿ÉÒÔ¸üÌôÌÞÒ»µã¶ù£¬Í¨¹ýÖ¸¶¨ EasyMock.notNull() Ö»ÔÊÐí·Ç null ×Ö·û´®£º
¡¡¡¡EasyMock.expect(mock.getRate(
¡¡¡¡(String) EasyMock.notNull(),
¡¡¡¡(String) EasyMock.notNull())).andReturn(1.5);
¡¡¡¡¾²Ì¬ÀàÐͼì²é»á·ÀÖ¹°Ñ·Ç String ¶ÔÏ󴫵ݸøÕâ¸ö·½·¨¡£µ«ÊÇ£¬ÏÖÔÚÔÊÐí´«µÝ USD ºÍ EUR Ö®ÍâµÄÆäËû String¡£»¹¿ÉÒÔͨ¹ýEasyMock.matches() ʹÓøüÏÔʽµÄÕýÔò±í´ïʽ¡£ÏÂÃæÖ¸¶¨ÐèÒªÒ»¸öÈý×ÖĸµÄ´óд ASCII String£º
¡¡¡¡EasyMock.expect(mock.getRate(
¡¡¡¡(String) EasyMock.matches("[A-Z][A-Z][A-Z]"),
¡¡¡¡(String) EasyMock.matches("[A-Z][A-Z][A-Z]"))).andReturn(1.5);
¡¡¡¡Ê¹Óà EasyMock.find() ¶ø²»ÊÇ EasyMock.matches()£¬¾Í¿ÉÒÔ½ÓÊÜÈκΰüº¬Èý×Öĸ´óд×Ó String µÄ String¡£
32/3<123>
¡¶2023Èí¼þ²âÊÔÐÐÒµÏÖ×´µ÷²é±¨¸æ¡·¶À¼Ò·¢²¼~

¹Ø×¢51Testing

ÁªÏµÎÒÃÇ

¿ì½ÝÃæ°å Õ¾µãµØͼ ÁªÏµÎÒÃÇ ¹ã¸æ·þÎñ ¹ØÓÚÎÒÃÇ Õ¾³¤Í³¼Æ ·¢Õ¹Àú³Ì

·¨ÂɹËÎÊ£ºÉϺ£À¼µÏÂÉʦÊÂÎñËù ÏîÆåÂÉʦ
°æȨËùÓÐ ÉϺ£²©Îª·åÈí¼þ¼¼Êõ¹É·ÝÓÐÏÞ¹«Ë¾ Copyright©51testing.com 2003-2024
ͶËß¼°Òâ¼û·´À¡£ºwebmaster@51testing.com; ÒµÎñÁªÏµ£ºservice@51testing.com 021-64471599-8017

»¦ICP±¸05003035ºÅ

»¦¹«Íø°²±¸ 31010102002173ºÅ