`

使用Junit和EasyMock编写单元测试

阅读更多
Junit开发建议--笔记

一、不要在测试用例的构造函数中做初始化
    答案是重载测试用例的setUp()方法进行初始化。
二、不要假定测试用例中测试的执行次序
    好的习惯是保持测试之间的独立性,使得它们在任何次序下执行的结果都是相同的。
三、测试要避免人工干预
    经验二讲的是不同的测试要避免相关性,而经验三讲的其实就是测试要避免自相关。
四、在子类中调用父类的setUp() 和tearDown()
五、不要硬性规定数据文件的路径
六、把测试的代码和被测的代码放在同样的目录下
七、正确命名测试
八、书写测试时要考虑地区和国家设置
九、利用Junit 的自动异常处理书写简洁的测试代码
    事实上在Junit 中使用try-catch 来捕获异常是没有必要的,Junit 会自动捕获异常。那些没有被捕获的异常就被当成错误处理。
十、充分利用Junit 的assert/fail 方法
     assertSame()用来测试两个引用是否指向同一个对象
     assertEquals()用来测试两个对象是否相等
十一、确保测试代码与时间无关
十二、使用文档生成器做测试文档。

EasyMock中的匹配模式

对于方法的期望参数,可以设置“模式匹配”,EasyMock自带的匹配模式函数如下:(一般用在set方法里)

eq(X value) 如果实际传过来的参数与value相同,则匹配 
anyBoolean(), anyByte(), anyChar(), anyDouble(), anyFloat(), anyInt(), anyLong(), anyObject(), anyShort() 匹配相应的基本类型的任意值
eq(X value, X delta) 在误差delta范围内匹配value,适用于double、float这样的数值类型 
aryEq(X value) 数组内容匹配.
isNull() 如果参数为null,则匹配.
notNull() 如果尝试不为null,则匹配.
same(X value) 如果期望参数与实际参数是同一个对象,则匹配(即==).
isA(Class clazz) 匹配当前类或其子类的实例.
lt(X value), leq(X value), geq(X value), gt(X value) 对基本数值类型,以如上不等式匹配.
startsWith(String prefix), contains(String substring), endsWith(String suffix) 适用于字符串,分别匹配前缀,包含,后缀.
matches(String regex), find(String regex) 以正则表达式regex匹配.
and(X first, X second) first,sencond是这里的任意函数,当他们同时匹配时.
or(X first, X second) first,sencond是这里的任意函数,当他们有一个匹配时匹配. 
not(X value) value是这里的任意函数,当其不匹配时匹配.

Junit中的异常测试


public void testEmpty() {
try {
Largest.largest(new int[] {});
fail("Should have thrown an exception");
} catch (RuntimeException e) { assertTrue(true);
}

}


一个简单的Junit例子,使用EasyMock的格式


import static org.easymock.EasyMock.expect;
import static org.easymock.classextension.EasyMock.createMock;
import static org.easymock.classextension.EasyMock.replay;
import static org.easymock.classextension.EasyMock.verify;

------------------需要使用的easymock的方法

import java.util.Map;

import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.environment.Request;

import com.nokia.warlock.contentadaptation.common.contentadaptationengine.ContentAdaptationEngineModel;

import junit.framework.TestCase;

------------------Junit的framework

public class ContentSelectorTest extends TestCase{

private ContentSelector m_contentSelector;

private Map m_mapMock;

private Parameters m_parameters;

private String m_expression;

private ContentAdaptationEngineModel m_contentAdaptationEngineModelMock;

private Request m_requestMock;

protected void setUp() throws Exception

------------------执行case前的初始化
{
  super.setUp(); 
  m_mapMock = createMock(Map.class);
  m_requestMock = createMock(Request.class);
  m_parameters = new Parameters();
  m_contentAdaptationEngineModelMock = createMock(ContentAdaptationEngineModel.class);

------------------Mock要使用的interface,也可以是object
}

protected void tearDown() throws Exception {
  super.tearDown();

------------------执行case后的释放
}

public void testSelectTrue()
{
  expect(m_mapMock.get("request")).andReturn(m_requestMock);
  expect(m_requestMock.getAttribute("adaptmodel")).andReturn(m_contentAdaptationEngineModelMock);
  expect(m_contentAdaptationEngineModelMock.getHtmlContent()).andReturn("<html>a</html>");
 
  replayMocks();

------------------记录Mock接口的动作
 
  m_expression ="<html>a</html>";
  m_contentSelector = new ContentSelector();
  boolean result = m_contentSelector.select(m_expression, m_mapMock, m_parameters);
 
  verifyMocks();

------------------验证Mock接口的动作
 
  assertTrue(result);
------------------验证返回值
}

public void testSelectFalse()
{
  expect(m_mapMock.get("request")).andReturn(m_requestMock);
  expect(m_requestMock.getAttribute("adaptmodel")).andReturn(m_contentAdaptationEngineModelMock);
  expect(m_contentAdaptationEngineModelMock.getHtmlContent()).andReturn("<html>a</html>");
 
  replayMocks();
 
  m_expression ="<html>abc</html>";
  m_contentSelector = new ContentSelector();
  boolean result = m_contentSelector.select(m_expression, m_mapMock, m_parameters);
 
  verifyMocks();
 
  assertFalse(result);
}

  private void replayMocks()
  {
      replay(m_mapMock);
      replay(m_requestMock);
      replay(m_contentAdaptationEngineModelMock);;
  }
    
  private void verifyMocks()
  {
      verify(m_mapMock);
      verify(m_requestMock);
      verify(m_contentAdaptationEngineModelMock);
  }
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics