EasyMock 单元测试

Java开发过程中需要使用EasyMock做单元测试,今天上手使用了一下,记录之!

开发环境:

JDK7.0+MyEclipse10+EasyMock3.3.1+Win7+JUnit4

1) 接口IAlgorithm.java

package com.wicresoft.EKA;

public interface IAlgorithm {
	public int Add(int x,int y);
	public int Mul(int x,int y);
}

2) 实现接口

package com.wicresoft.EKA;

public class Algorithm implements IAlgorithm {
	public int Add(int x,int y){
		return x + y;
	}
	
	public int Mul(int x,int y){
		return x * y;
	}
}

3) 调用者

package com.wicresoft.EKA;

public class Calcutor {
	
	private IAlgorithm agent;
	
	public Calcutor(IAlgorithm agent){
		this.agent = agent;
	}
	
	public int CalcAdd(int x,int y){
		return agent.Add(x, y);
	}
}

4) 单元测试

package com.wicresoft.EKA.Test;
import static org.junit.Assert.*;
import org.easymock.EasyMock;
import org.easymock.EasyMockSupport;
import org.junit.Test;
import com.wicresoft.EKA.*;
public class AlgorithmTest extends EasyMockSupport {
 @Test
 public void testAdd() {
  Algorithm algorithm = new Algorithm();
  int expected = 10;
  int actual = algorithm.Add(3, 7);
  assertEquals(expected, actual);
 }
 
 @Test
 public void testMul() {
  try{
   int x = 3;
   int y = 4;
   int z = 7;
   
   IAlgorithm mock = createMock(IAlgorithm.class);
   Calcutor calc = new Calcutor(mock);
   EasyMock.expect(calc.CalcAdd(x,y)).andReturn(z).anyTimes();
   
   EasyMock.replay(mock);
   EasyMock.verify(mock);
      
  }catch(Exception e){
   e.printStackTrace();
  }
 }
}

注:

1)这里有一个TestAdd是使用MyEclipse的JUnit的框架写的普通单元测试,TestMul是通过EasyMock写的单元测试;

2)引用jar包如下:

3) 运行单元测试

总结:

1.关于EasyMock的详细使用,点击:http://easymock.org/

2.如果发生 java.lang.NoClassDefFoundError异常

java.lang.NoClassDefFoundError: org/objenesis/ObjenesisHelper

	at org.easymock.internal.ObjenesisClassInstantiator.newInstance
...

需要引用objenesis-1.1.jar包,下载地址:http://download.csdn.net/download/dreamStronger/3074415
3.如果发生java.lang.AssertionError异常

java.lang.AssertionError: 
  Expectation failure on verify:
    Algorithm.Add(3, 4): expected: 1, actual: 0
...

则注意在方法调用后面调用anyTimes();函数如果需要expect的方法没有返回值, 应该这样写: 先执行mock的要调用的方法, 然后调用EasyMock.expectLastCall().anyTimes();
4.Recored - Replay - Verify 模型

      record-replay-verify 模型容许记录mock对象上的操作然后重演并验证这些操作。这是目前mock框架领域最常见的模型,几乎所有的mock框架都是用这个模型,有些是现实使用如easymock,有些是隐式使用如jmockit。

      Record

       我们开始创建mock对象,并期望这个mock对象的方法被调用,同时给出我们希望这个方法返回的结果。这就是所谓的"记录mock对象上的操作", 同时我们也会看到"expect"这个关键字。 总结说,在record阶段,我们需要给出的是我们对mock对象的一系列期望:若干个mock对象被调用,依从我们给定的参数,顺序,次数等,并返回预设好的结果(返回值或者异常).

      Replay

      在replay阶段,我们关注的主要测试对象将被创建,之前在record阶段创建的相关依赖被关联到主要测试对象,然后执行被测试的方法,以模拟真实运行环境下主要测试对象的行为。

      在测试方法执行过程中,主要测试对象的内部代码被执行,同时和相关的依赖进行交互:以一定的参数调用依赖的方法,获取并处理返回。我们期待这个过程如我们在record阶段设想的交互场景一致,即我们期望在replay阶段所有在record阶段记录的行为都将被完整而准确的重新演绎一遍,从而到达验证主要测试对象行为的目的。

      Verify

      在verify阶段,我们将验证测试的结果和交互行为。

      通常验证分为两部分,如上所示: 一部分是验证结果,即主要测试对象的测试方法返回的结果(对于异常测试场景则是抛出的异常)是否如预期,通常这个验证过程需要我们自行编码实现。另一部分是验证交互行为,典型如依赖是否被调用,调用的参数,顺序和次数,这部分的验证过程通常是由mock框架来自动完成,我们只需要简单调用即可。

      在easymock的实现中,verify的部分交互行为验证工作,会提前在replay阶段进行:比如未记录的调用,调用的参数等。如果验证失败,则直接结束replay以致整个测试案例。

      record-replay-verify 模型非常好的满足了大多数测试场景的需要:先指定测试的期望,然后执行测试,再验证期望是否被满足。这个模型简单直接,易于实现,也容易被开发人员理解和接受,因此被各个mock框架广泛使用。

      最后,项目代码+libs包 下载地址:http://download.csdn.net/detail/afandaafandaafanda/8392209 

 

 

      

 


 


 



 


 


 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Eclipse是一款常用的集成开发环境(IDE),用于开发Java应用程序。在Eclipse中,我们可以通过一些插件和工具来方便地生成和运行单元测试。 首先,在Eclipse中,我们可以使用JUnit插件来生成和管理单元测试。JUnit是一个流行的Java单元测试框架,它提供了一系列注解和断言方法,能够方便地编写和执行单元测试。 要生成单元测试,我们首先需要创建一个Java类或方法,然后右键点击该类或方法,在弹出菜单中选择“Coverage As”->“JUnit Test”。这将会生成一个测试类,并自动导入JUnit的相关库并创建相应的测试方法。 生成的测试方法会自动使用JUnit的注解进行标记,例如@Test表示该方法是一个单元测试方法。在测试方法中,我们可以使用各种断言方法,如assertEquals、assertTrue等来验证代码的正确性。 在生成单元测试后,我们可以通过运行JUnit测试来执行测试代码。只需要右键点击测试类,选择“Run As”->“JUnit Test”,或者使用Eclipse的快捷键Ctrl + F11来运行测试。 运行单元测试后,JUnit将显示测试通过和测试失败的结果,并提供详细的错误信息。我们可以通过查看测试结果来了解代码是否按照预期运行,并且快速定位和修复错误。 此外,Eclipse还提供了一些其他工具和插件来辅助单元测试的生成和执行,如Mockito、EasyMock等。这些工具可以帮助我们模拟和控制一些外部依赖,使得单元测试更加简单和高效。 总之,通过Eclipse中的JUnit插件和其他辅助工具,我们可以方便地生成和执行单元测试,以确保我们的Java代码质量和正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值