本文将介绍Junit和EasyMock结合进行复杂环境的模拟测试。
在我们开发的过程中往往会遇到程序十分复杂,结果不能即时获得的情况。譬如远程数据库的连接或者网络获取数据的情况,但是此时我们已经写好部分功能并希望进行测试。那么此时,我们只能预设复杂过程的输出。设置复杂过程的输出需要借助EasyMock这个开源工具,大家可以去度娘下载。
package net.jessenpan.test; public interface IRemoteConnection { public abstract String getRemoteData(); } package net.jessenpan.test; import java.io.IOException; import java.io.InputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class RemoteConnection implements IRemoteConnection { /* (non-Javadoc) * @see IRemoteConnection#getRemoteData() */ @Override public String getRemoteData(){ String result=null; Socket socket=null; try { InetAddress inetAddress=InetAddress.getByName("www.facebook.com"); socket=new Socket(inetAddress, 8080); InputStream inputStream=socket.getInputStream(); byte[] resultBytes=new byte[50]; inputStream.read(resultBytes,0,10); result=resultBytes.toString(); } catch (Exception e) { e.printStackTrace(); }finally{ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } return result; } }
通过EasyMock就可以解决上述问题。代码如下:
package net.jessenpan.Junittest; import static org.junit.Assert.*; import net.jessenpan.test.IRemoteConnection; import org.easymock.EasyMock; import org.junit.Test; public class RemoteConnectionTest { private IRemoteConnection Iremote=null; @Test public void testGetRemoteData() { Iremote=EasyMock.createMock(IRemoteConnection.class); EasyMock.expect(Iremote.getRemoteData()).andReturn("Hello,World"); EasyMock.replay(Iremote); String expect="Hello,World"; String actual=Iremote.getRemoteData(); assertEquals(expect, actual); EasyMock.verify(Iremote); } }
EasyMock是通过录制,预设返回并回放的构造进行单元测试的。
首先我们设置当调用getRemoteData()时,返回Hello,World。然后通过设置replay进行回放。
那么当我们进行测试并调用getRemoteData()时,返回的数据即为设定的Hello,World,而不是从facebook返回的数据。通过这种方法可以使我们在极端环境下进行测试工作,从而增加程序的健壮性。