使用EasyMock扩展为Class提供Mock对象
Author:kongxx
通常我么在测试一些类的时候需要依赖另外一些类或接口,而此时可能这些类或接口可能仅仅是方法签名而没有真正的实现。此时我们就可以使用一些第三方类库来解决这个问题,比如常用的EasyMock,JMock等。但是这两个类库默认情况下都只能Mock接口,而不能Mock类,那么我们应该怎样解决这个问题呢?其实EasyMock和JMock两个框架也提供了对类作Mock的解决办法,不过这个功能需要他们提供的一个扩展类库才能实现。我们可以在他们的官方网站上下载这两个扩展。对于EasyMock下载EasyMock Class Extension 2.0_Pre-Release,对于JMock下载 jMock/CGLIB extension binary JAR。
下面是一个小例子:
Worker.java一个需要测试的业务类,它依赖一个抽象的Configuration对象.
class package easymock;
public class Worker {
private Configuration configuration;
public Configuration getConfiguration() { return configuration; }
public void setConfiguration(Configuration configuration) { this.configuration = configuration; }
public boolean execute() { String name = configuration.getName(); String type = configuration.getType();
if(name.equals("System") && type.equals("Snapshot")) { // TODO
return true; } return false; } }
{ public static void main(String[] args) { System.out.println("Hello World!"); } }
|
Configuration.java一个抽象类,会有一些子类来实现它的抽象方法.
package easymock;
import java.io.File;
public abstract class Configuration {
protected String name; protected String type;
public abstract Configuration configurate(File file);
public abstract String getName();
public abstract String getType(); }
|
WorkerTest.java一个测试类,需要用到Configuration对象实例,这里Mock了一个Configuration对象用来为execute方法提供支持.
package easymock;
import junit.framework.TestCase; import org.easymock.classextension.*;
public class WorkerTest extends TestCase { private Worker worker; protected void setUp() throws Exception { super.setUp();
worker = new Worker(); }
protected void tearDown() throws Exception { super.tearDown(); }
/* * Test method for 'easymock.Worker.execute()' */ public void testExecute() { Configuration conf = (Configuration)EasyMock.createMock(Configuration.class); EasyMock.expect(conf.getName()).andReturn("System"); EasyMock.expect(conf.getType()).andReturn("Snapshot");
EasyMock.replay(conf);
worker.setConfiguration(conf);
// 执行带测试的方法 assertTrue(worker.execute()); }
}
|
运行JUnit测试,GreenBar。OK!
分享到:
相关推荐
- **创建Mock对象**:使用Easymock框架提供的工具类创建Mock对象。 - **定义行为**:在Record阶段,通过调用Mock对象的方法来定义其行为。 - **激活Mock对象**:在Replay阶段,激活Mock对象使其能够按照定义好的行为...
1. **生成 Mock 对象**:使用EasyMock的`createMock()`方法,指定需要Mock的接口或类,如`EasyMock.createMock(java.sql.ResultSet.class)`。 2. **设置预期行为**:通过`expect()`方法,定义Mock对象在测试期间...
- 使用`Mockito.mock(Class)`创建模拟对象。 - 使用`when(mockObject.someMethod()).thenReturn(someValue)`来设置方法的返回值。 - 测试时直接使用模拟对象,无需`replay`和`verify`步骤。 2. **高级特性** - ...
例如,如果你有一个名为`MyInterface`的接口,你可以这样创建它的模拟对象:`MyInterface mock = EasyMock.createMock(MyInterface.class);` 2. **定义预期**:接着,你需要使用`expect()`方法设置模拟对象的方法...
在 EasyMock 中,你可以通过扩展 `EasyMock` 类或使用 `createMock()` 方法来创建 mock 对象。例如,如果你有一个名为 `MyService` 的接口,你可以这样创建它的 mock 实例: ```java MyService myServiceMock = ...
2. **创建模拟对象**:使用`EasyMock.createMock()`方法创建模拟对象,如`MyInterface mockObject = EasyMock.createMock(MyInterface.class);` 3. **设置期望**:利用`EasyMock.expect()`方法设置模拟对象的行为,...
4. **扩展(Extensions)**:Easymock 3.2包含了ClassExtension,它允许你模拟final类和非接口类型。这在很多情况下非常有用,因为有些库可能使用了final类或者非接口设计,而Easymock通过扩展可以支持这类场景的...
此外,还可以结合使用EasyMock的扩展如ClassExtension,它支持模拟静态方法和final类。 在编写测试时,合理地使用EasyMock可以帮助你专注于测试目标代码的逻辑,而不是被依赖的外部系统。通过精确控制模拟对象的...
7. **静态方法模拟**:虽然EasyMock主要针对实例方法的模拟,但它也提供扩展机制(如使用EasyMock Class Extension)来模拟静态方法。 8. **类型安全**:EasyMock 2.5.1版可能已经提供了类型安全的API,这使得在...
- EasyMock Class Extension:允许对静态方法和 final 类进行模拟,扩展了 EasyMock 的使用范围。 - Callbacks:可以指定当模拟对象被调用时执行的回调函数,实现自定义行为。 - Partial Mocking:只对部分方法进行...
此外,EasyMock还有扩展,如EasyMock Class Extension,它可以自动管理模拟对象的生命周期,使测试代码更简洁。另外,EasyMock还支持Mockito的注解风格,使得测试代码更易读。 在实际项目中,使用EasyMock可以提高...
在Easymock中,我们通常会使用`EasyMock.createMock()`方法来创建模拟对象,然后使用`expect()`方法设置模拟对象的行为。例如,如果我们有一个名为`MyClass`的类,它有一个可能抛出异常的方法`doSomething()`,我们...
使用Mockito,你可以声明一个对象为Mock,然后设置它的行为,比如当调用某个方法时返回特定值或者触发某些动作。下面是一个简单的Mockito示例: ```java import static org.mockito.Mockito.*; // 创建Mock对象 ...
EasyMock是一个强大的Java库,用于创建模拟对象(Mock Objects),它使得单元测试变得更加简单。在测试过程中,模拟对象可以替代真实的依赖,这样我们就可以专注于测试单个方法,而不用担心其他部分的复杂性。...
1. **模拟对象(Mock Object)**:EasyMock 创建的模拟对象用于代替真实的依赖,可以预定义其行为和预期调用。 2. **期望(Expectations)**:在测试中,你需要设定模拟对象应如何响应特定的调用,这称为期望。例如...
3. 使用PowerMock创建需要模拟的对象,例如`PowerMockito.mockStatic(YourClass.class)`。 4. 使用EasyMock或Mockito定义模拟对象的行为和期望。 5. 使用JUnit的@Test注解编写测试用例,运行测试。 总的来说,...
EasyMock是一个模拟框架,它允许开发者创建预期的交互(mock objects)并验证对象之间如何进行通信。通过创建mock对象,我们可以设定对象的行为,比如期望调用的方法、参数和返回值。这种方法在测试时非常有用,因为...
同时,EasyMock还提供了扩展功能,如EasyMock Class Extension,可以帮助自动管理模拟对象的生命周期,简化测试代码。 总之,EasyMock 是一个强大而灵活的工具,它使得Java开发者能够在单元测试中有效地隔离依赖,...
PowerMock是一个强大的扩展工具,它可以与Mockito、EasyMock等主流Mock框架结合,允许我们模拟静态方法、构造器、final类和方法、删除静态初始化器等。 标题“使用PowerMock来Mock静态函数”指的是如何利用...