`

使用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);
  }
}
分享到:
评论

相关推荐

    Junit+EasyMock单元测试使用资料以及案例分析

    Junit和EasyMock是Java领域中广泛使用的两个工具,它们协同工作,提供了强大的单元测试能力。本文将深入探讨这两个工具的使用,并通过案例分析帮助你更好地理解和应用它们。 **Junit简介** JUnit是Java编程语言中最...

    Junit+EasyMock单元测试的jar包

    Junit和EasyMock是Java开发中广泛使用的两个工具,它们协同工作,帮助程序员高效地进行单元测试。 Junit是一个开源的Java测试框架,主要用于编写和运行面向对象软件的测试案例。它提供了断言方法来验证代码的行为,...

    转:EasyMock 单元测试

    在实践中,结合使用 EasyMock 和其他测试工具,如 JUnit 或 TestNG,可以帮助开发者构建出强大而健壮的测试套件,从而提升软件质量。记住,良好的单元测试不仅仅是找出问题,更是预防问题的发生。通过使用 EasyMock...

    单元测试的基本理论与使用

    通过编写测试用例,我们可以确保每个单元在不同条件下的行为正确无误。 JUnit是Java平台上的一个流行单元测试框架,它为编写和执行单元测试提供了便利。在描述中提到,这个资料可能不涉及使用JUnit的注解,但通常...

    powermock-easymock-junit-1.5.4.zip

    5. 使用JUnit的@Test注解编写测试用例,运行测试。 总的来说,PowerMock、EasyMock和JUnit的组合为Java开发者提供了一个强大的单元测试工具链,使得即使在面对复杂和难以测试的代码时,也能确保软件的质量和可靠性...

    junit4.4.jar +easymock3.0.jar

    将这两个库结合使用,开发者可以在进行单元测试时,利用JUnit来组织和执行测试,而使用EasyMock来模拟复杂的依赖关系,使得测试更加独立和可控。通过这种方法,开发者可以专注于测试单个方法或组件,而不必担心外部...

    EasyMock介绍和使用

    2. **测试驱动开发(TDD)**:在TDD过程中,开发者先编写测试,然后实现满足测试的代码。EasyMock可以帮助快速搭建测试环境,验证代码功能。 3. **复杂逻辑验证**:对于有复杂条件判断或流程控制的代码,EasyMock...

    基于软件测试的ATM服务机

    对于单元测试,Eclipse的JUnit插件提供了便捷的测试框架,允许开发者编写和运行JUnit测试用例。JUnit是一个流行的Java单元测试框架,它提供了断言方法来验证代码行为,以及注解来简化测试用例的定义。 接着,...

    生成junit测试类

    综上所述,这篇博文可能探讨了如何使用EasyMock和PowerMock这些工具来生成和增强JUnit测试类,帮助开发者编写更加高效和全面的单元测试。通过这些技术,可以更好地控制测试环境,确保代码的质量和可靠性。

    jmock2.5.1和easymock3.0

    而JMock和EasyMock则是两种广泛使用的Java单元测试框架,它们允许开发者模拟对象的行为和交互,以便于测试复杂的系统。本资源包含JMock 2.5.1和EasyMock 3.0的库文件,使得开发者在进行单元测试时无需再四处寻找相关...

    easymock3.1 jar包和powermock1.4.10 jar包(以及附带junit jar包)

    总结一下,Easymock3.1和PowerMock1.4.10是Java单元测试的重要工具,它们与JUnit配合使用,可以帮助开发者对各种复杂情况进行精确的测试,提高代码质量。在实际项目中,正确地使用这些库可以大大提升测试的覆盖率和...

    easymock selenium junit

    然后,使用JUnit编写测试用例,覆盖各个功能点。最后,通过Selenium将这些测试扩展到实际的浏览器环境中,验证用户界面的交互和响应。 在"学习总结"这个文件中,你可能找到了关于如何集成和运用这三个工具的笔记,...

    powermock-easymock-junit-1.6.1.zip

    在Java单元测试中,PowerMock和EasyMock是两个强大的库,它们扩展了JUnit的功能,使得开发者可以测试那些通常难以或无法直接测试的代码。PowerMock是基于EasyMock的一个扩展,它允许模拟静态方法、构造函数、final类...

    单元测试 单元测试 java

    在Java中,我们通常使用JUnit框架来编写和运行单元测试。JUnit是Java领域最广泛使用的单元测试框架,它提供了丰富的注解、断言和测试结构,使得测试代码编写简洁且易于理解。以下是一些关于单元测试和JUnit的重要...

    easymock测试servlet

    Easymock是一个流行的Java库,它提供了创建和管理模拟对象的能力,帮助测试人员编写单元测试。 在"easymock测试servlet"的场景中,我们看到`SampleServletTest`类正在使用Easymock来测试`SampleServlet`类的行为。...

    easymock 3.0

    下面是一些使用Easymock 3.0和JUnit进行单元测试的关键知识点: 1. **创建Mock对象**:使用`EasyMock.createMock()`方法创建mock对象。例如,如果你有一个名为`MyClass`的类,你可以创建它的mock对象如下: ```...

    easyMock resource

    EasyMock和JUnit是两个常用的单元测试工具,它们在Java开发领域中广泛使用。让我们深入探讨一下这两个工具以及如何将它们结合使用。 首先,`JUnit`是一个开源的测试框架,主要用于编写Java应用程序的单元测试。它...

    easymock-3.2.zip

    与JUnit结合使用时,你可以轻松地在测试类中引入EasyMock,编写简洁的测试用例。例如,使用`@Before`注解设置测试前的准备工作,使用`@Test`注解定义测试方法,并在其中使用EasyMock的API进行模拟和验证。 总之,...

    EasyMock.jar

    8. **类型安全**:EasyMock 2.5.1版可能已经提供了类型安全的API,这使得在编写测试代码时能获得编译时的错误检查,减少运行时错误的可能性。 使用EasyMock进行单元测试可以帮助提高代码质量,减少回归错误,并使...

Global site tag (gtag.js) - Google Analytics