下面是mock对象:public class MockSystemEnvironment implements Environmental { private long currentTime; public long getTime() { return currentTime; } public void setTime(long currentTime) { this.currentTime = currentTime; } public void playWavFile(String fileName) { playedWav = true; } public boolean wavWasPlayed() { return playedWav; } public void resetWav() { playedWav = false; } }
下面是一个调用getTime的具体类: import java.util.Calendar; public class Checker { private Environmental env; public Checker(Environmental env) { this.env = env; } public void reminder() { Calendar cal = Calendar.getInstance(); cal.setTimeInMills(env.getTime()); int hour = cal.get(Calendar.HOUR_OF_DAY); if(hour >= 17) { env.playWavFile("quit_whistle.wav"); } } }
使用env.getTime()的被测代码并不知道测试环境和真实环境之间的区别,因为它们都实现了相同的接口。现在,你可以借助mock对象,通过把时间设置为已知值,并检查行为是否如预期那样来编写测试。
import java.util.Calendar; import junit.framework.TestCase; public class TestChecker extends TestCase { public void testQuittingTime() { MockSystemEnvironment env = new MockSystemEnvironment(); Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, 2006); cal.set(Calendar.MONTH, 11); cal.set(Calendar.DAY_OF_MONTH,7); cal.set(Calendar.HOUR_OF_DAY, 16); cal.set(Calendar.MINUTE, 55); long t1 = cal.getTimeInMillis(); env.setTime(t1); Checker checker = new Checker(env); checker.reminder(); assertFalse(env.wavWasPlayed()); t1 += (5*60*1000); env.setTime(t1); checker.reminder(); assertTrue(env.wavWasPlayed()); env.resetWav(); t1 += 2*60*60*1000; env.setTime(t1); checker.reminder(); assertTrue(env.wavWasPlayed()); } }
(编辑:aniston)
|