????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????????????? 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 ???????????????????????????????????????????????????????????????漣???? ExchangeRate????????????????????????????????????????
????????????????????????????????δ???????????????????????????? “?????” ???? Java 1.3 ??????? Java 5 ?????????????? ?ο????????????????????????????????????????????Щ??????????????????????
?????????????????????????? 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 ???????????????????????????磬?????????????????????????????????????????????? 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 ?е??????????????????????′????????
????"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??