自从用了有道笔记之后,好久都没来iteye了。不过最近打算继续把ITEYE捡起来。
言归正传,开始我们今天的EasyMock。在做UT时,很多时候,由于要依赖其他各种的对象,导致我们的测试非常的不方便,问题在于,我们真的需要将所依赖的所有对象都实例化出来吗?答案当然是 不,利器就在于我们的EasyMock。Mock的意思是模仿,仿造,所以,EasyMock的作用就是将你需要的对象给造一个假的出来。而且很easy哦。
通过EasyMock,我们可以为指定的接口动态的创建Mock对象,并未对象设置期望的行为和输出,从而完成单元测试。所以过程可以分为以下几个步骤:
- 使用 EasyMock 生成 Mock 对象;
- 设定 Mock 对象的预期行为和输出;
- 将 Mock 对象切换到 Replay 状态;
- 调用 Mock 对象方法进行单元测试;
- 对 Mock 对象的行为进行验证。
下面看个简单的例子:
MockDemo.java
/**
* 需要被mock的接口
*/
public class MockDemo {
public int getResult();
}
MockDemoInvoker.java
/**
* Mock对象的调用者,提供一个print方法,将调用MockDemo的getResult方法,并将其值返回。
*
*/
public class MockDemoInvoker {
private MockDemo mockDemo = null;
public MockDemo getMockDemo() {
return mockDemo;
}
public void setMockDemo(MockDemo mockDemo) {
this.mockDemo = mockDemo;
}
public MockDemoInvoker(MockDemo mockDemo) {
super();
this.mockDemo = mockDemo;
}
public int print() {
int result = mockDemo.getResult();
System.out.println(result);
return result;
}
}
MockDemoTest.java
public class MockDemoTest {
private MockDemo mockDemo = null;
private MockDemoInvoker mockDemoInvoker = null;
@Before
public void init(){
// Step 1: create mock object
mockDemo = EasyMock.createMock(MockDemo.class);
}
@Test
public void doMockDemo(){
// Step 2: set expect behavior and return value
EasyMock.expect(mockDemo.getResult()).andReturn(813);
// Step 3: set mock object status to "Replay"
EasyMock.replay(mockDemo);
// Step 4: invoke mock object
mockDemoInvoker = new MockDemoInvoker(mockDemo);
int result = mockDemoInvoker.print();
// Step 5: verify result
Assert.assertEquals(result, 813);
}
}
在测试方法中,我写出了整个easymock的5个步骤,非常的清晰,easy。我们并不需要关心MockDemo的getResult是如何实现的,而只需要关心它的期望结果,比如这里我们期望它返回813。这样,在做单元测试的时候,就将我们调用者的业务跟接口的实现解耦了。