EasyMock

使用EasyMock的总体步骤:


1、生成Mock接口

方式一: ExampleDao mock = EasyMock.createMock(ExampleDao.class);

方式二: IMocksControl control = EasyMock.createControl();
ExampleDao1 mock1 = control.createMock(ExampleDao1.class);
ExampleDao2 mock2 = control.createMock(ExampleDao2.class);

方式三: @RunWith(EasyMockRunner.class)
public class ExampleTest {


@Mock
private ExampleDao mock;//1 注入dao层mock

@TestSubject
private ExampleService exampleService = new ExampleServiceImpl();//2.测试目标类



2、设置预期行为

a.如果返回值是void:
mock.doVoidMethod();  
EasyMock.expectLastCall();// 最新版本的EasyMock可以忽略此句

b.如果要求抛出异常:
EasyMock.expectLastCall().andThrow(new RuntimeException()).anyTimes(); 

c.如果返回值不是void:
EasyMock.expect(mockService.doSomething(isA(Long.class), isA(Report.class),   
        isNull(Report.class))).andReturn("return string").anyTimes();
上例方法中传入3个参数,分别是Long、Report、null——注意,如果参数是基本类型long,则使用EasyMock.anyLong()

3、将Mock对象切换到replay状态
EasyMock.replay(mock);
如果是用MockControl来管理:
control.replay(); 
4、测试
exampleService.setDao(mock);  //注解不需要  自动注入
exampleService.doSomething();  

5、验证Mock对象的行为
EasyMock.verify(mock);
如果是用MockControl来管理:
control.verify();

注意:
expect()注意事项:

a.期望传入参数为基本类型时
用expect来设置mock方法的期望调用方式时,如果使用到基本类型,但是又不要基本类型的值,
不能用:EasyMock.isA(Long.class)
要用:EasyMock.anyLong()

b.期望传入参数可能为null时
要用:or(isA(String.class), isNull()) 
不能用:isA(String.class) 

c.如果返回结果在运行时才能确定
很可能某个方法期望的返回结果不是固定的,例如根据传入参数不同而不同;这时需要使用andAnswer():
EasyMock.expect(mockService.execute(EasyMock.anyInt())).andAnswer(new IAnswer<Integer>() {  
            public Integer answer() throws Throwable {  
                Integer count = (Integer) EasyMock.getCurrentArguments()[0];  
                return count * 2;  
            }  
        });  
### Easymock 使用指南及示例 #### 创建 Mock 对象 为了创建 mock 对象,可以使用 `@TestSubject` 和 `@Mock` 注解来简化这一过程。这使得测试类能够自动识别并替换被测对象及其依赖项[^1]。 ```java import org.easymock.EasyMockRunner; import org.junit.runner.RunWith; @RunWith(EasyMockRunner.class) public class ExampleTest { @TestSubject private ClassUnderTest systemUnderTest = new ClassUnderTest(); @Mock private Dependency dependency; } ``` #### 设置预期行为 通过定义方法调用的期望结果来进行设置。对于每一个要模拟的方法调用,都需要指定其返回值或异常抛出情况,并且可以通过 `expect()` 方法链式调用来实现这一点。 ```java @Test public void shouldReturnExpectedValue() { // Arrange expect(dependency.someMethod()).andReturn("expected value"); // Act & Assert replay(dependency); assertEquals(systemUnderTest.methodToTest(), "expected value"); verify(dependency); } ``` #### 验证交互 完成动作之后,应该验证所有已记录的行为确实发生过一次而且仅有一次;如果某些特定条件下的操作未被执行,则应确保这些情形也被适当处理了。此步骤通常放在断言之前执行以确认所有的预设都被满足。 ```java verify(dependency); // Verifies that all expected interactions occurred. ``` #### 控制重复次数 除了简单的单次匹配外,还可以利用 `times(int)` 或者其他类似的限定符来自定义某个行为发生的频率范围。这对于那些需要多次触发相同逻辑的情况特别有用。 ```java // Expecting method to be called exactly twice. expect(dependency.anotherMethod()).andReturn(true).times(2); ``` #### 处理参数变化 当面对具有不同输入值得函数时,可借助于捕获器(Capture)机制收集实际传入的数据以便后续分析,或是采用更为灵活的方式——即允许任意类型的实参传递给目标方法而不限定具体形式。 ```java // Using anyInt() matcher for integer parameters. dependency.processData(anyInt()); expectLastCall().once(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值