本文将介绍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;
}
}
可以看到,上述代码的作用是从faceboook获取数据并返回相应的数据,但是国内并无法访问。那么这个函数我们就无法进行测试了。有没有什么办法可以解决呢?
通过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返回的数据。通过这种方法可以使我们在极端环境下进行测试工作,从而增加程序的健壮性。