接着,SystemTimeSynchronizerTests就可以作很大的改进,通过预设标准时间,测试SystemTimeSynchronizer#syncTime()的各个处理分支了。
/**shannon.demo.unittest is the unit test codes
* package for the demonstration.
*/
package shannon.demo.unittest;
import shannon.demo.DebugClock;
import shannon.demo.SystemTimeSynchronizer;
import shannon.demo.UnitTestFirewall;
import junit.framework.TestCase;
/**<code>SystemTimeSynchronizerTest</code> is the
* unit test class for SystemTimeSynchronizer
* @author Shannon Qian
*/
public class SystemTimeSynchronizerTest extends TestCase {
protected void setUp() throws Exception {
super.setUp();
UnitTestFirewall.setDebugging(true);
UnitTestFirewall.presetClock(debugClock);
}
protected void tearDown() throws Exception {
super.tearDown();
}
private static DebugClock debugClock=new DebugClock();
public void testSyncTime() {
SystemTimeSynchronizer sync=new SystemTimeSynchronizer();
assertTrue(sync.syncTime()==0);
debugClock.setTime(System.currentTimeMillis()-10L);
assertTrue(sync.syncTime()==1);
debugClock.setTime(System.currentTimeMillis()+10L);
assertTrue(sync.syncTime()==-1);
}
}
这是我在具体工作中一个图省力的法子,所谓单元测试中的“防火墙”就是将外部模块的影响屏蔽在模块单元测试之外,不知是否违背单元测试的精神。
再总结一下这种控制单元测试范围的方法,有两个好处:
1) 免去许多配置和调试外部模块的工作;
2) 可以方便的模拟其他模块的各种行为,提供各种场景测试条件。
当然,实际问题要复杂的多,所以我们可能要比这个例子做得更多。但正因为实际问题复杂,我们省的力气也要多得多。
另外有同事告诉我JMock和easyMock也提供和我上面所讨论的法子类似的功能。我花了极少的时间试着了解过JMock,但还没入门,所知很少,还望有经验的同行指教。再次感谢myworkfirst的指点。
(完)