我们都有这种经验,测试在我们软件编码过程中占据了大部分时间,有时候觉得软件业务代码好写,但测试代码却难写了,单元测试是把自己的代码交托给测试同学和其他同学前的承诺。
为了获得更好的代码质量,我们一般都会用几好种工具,其中FindBugs和Emma(http://update.eclemma.org)就是常用的。
在测试与其它系统有交互的功能块,并且其它系统的稳定性未知的情况下,Mock就得派上用场了,否则测试起来极其吃力,并且效率低下。
下面简单介绍下两种Mock测试框架:JMock【http://www.jmock.org】和Mockito【http://www.mockito.org】。
一、前提说明
两个类:一个被Mock的对象(MayMockObject),一个被测试的对象(MainTstObject)。
很明显,我们的任务是测试MainTstObject,而该类引用了MayMockObject,为了测试的进行,我们模拟MayMockObject的实例。
测试用例类:MainTstObjectJMockTest和MainTstObjectMockitoTest。
二、依赖加入
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<version>4.4</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<scope>test</scope>
<version>1.8.5</version>
</dependency>
<dependency>
<groupId>jmock</groupId>
<artifactId>jmock</artifactId>
<scope>test</scope>
<version>2.5.1</version>
</dependency>
当然,如果工程不是基于Maven构架的,可以直接加入相应的Jar也行。
三、外接接口(将被Mock的对象)
public interface MayMockObject {
public String getString(String str);
}
四、功能类(被测试的类)
public class MainTstObject {
private MayMockObject mayMockObject; // 引用了外接接口
public String create(String str1, String str2) {
return str1 + this.mayMockObject.getString(str2);
}
public void setMayMockObject(MayMockObject mayMockObject) {
this.mayMockObject = mayMockObject;
}
}
五、JMock的测试用例
public class MainTstObjectJMockTest {
private Mockery context = new JUnit4Mockery();
private MayMockObject mayMockObject;
private MainTstObject mainTstObject;
@Before
public void setUp() {
this.mayMockObject = this.context.mock(MayMockObject.class); // Mock了外接接口
this.mainTstObject = new MainTstObject();
this.mainTstObject.setMayMockObject(this.mayMockObject);
}
@Test
public void process() {
final String str1 = "Mockito返回字符串。";
final String str2 = "Mockito返回字符串。";
this.context.checking(new Expectations() {
{
oneOf(mayMockObject).getString(str2);
will(returnValue("")); // Mock返回值
// allowing(mayMockObject).getString(with(any(String.class)));
// will(returnValue(""));
}
});
String ret = this.mainTstObject.create(str1, str2);
Assert.assertEquals(ret, str1);
}
@After
public void tearDown() {
}
}
六、Mockito的测试用例
public class MainTstObjectMockitoTest {
// 指定Mock的对象
@Mock
private MayMockObject mayMockObject;
private MainTstObject mainTstObject;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this); // 声明测试用例类
this.mainTstObject = new MainTstObject();
this.mainTstObject.setMayMockObject(this.mayMockObject);
}
@Test
public void process() {
String str1 = "Mockito返回字符串。";
String str2 = "Mockito返回字符串。";
Mockito.when(this.mayMockObject.getString(str2)).thenReturn(""); // Mock返回值
String ret = this.mainTstObject.create(str1, str2);
Assert.assertEquals(ret, str1);
}
@After
public void tearDown(){
}
}
七、最后
从两个测试用例可以看出,JMock和Mockito在用法上的一些区别:
1、对于要Mock的对象,JMock要显示指出来【this.mayMockObject = this.context.mock(MayMockObject.class);】;
而Mockito只是简单加上注释【@Mock】,然后声明下测试用例类即可【MockitoAnnotations.initMocks(this);】。
2、对于方法的模拟,JMock显得更加复杂了【this.context.checking(new Expectations() {
{
oneOf(mayMockObject).getString(str2);
will(returnValue(""));
}
});】
而Mockito只要简单的一行代码就行【Mockito.when(this.mayMockObject.getString(str2)).thenReturn("");】。
从上可以看出,Mockito的代码行更少,更加简洁,个人比较喜欢用Mockito,简洁易记!
另外需要注意的是:JMock只能Mock接口,也就是上面的例子中【MayMockObject】只能为接口,不能为实体类;而Mockito就没有这个限制。
当然,我们既然用Mock,就是因为只知接口,而不知其具体实现,这样说来,JMock只能Mock接口不能算是Mockito的一个优点了。
分享到:
相关推荐
JMock可以与其他单元测试框架如JUnit、TestNG等无缝集成,提供更加全面的测试支持。它也可以与Mockito、PowerMock等其他模拟库一起使用,以应对更复杂的测试需求。 总结来说,JMock是一个强大且灵活的Java模拟工具...
JMock可以与多种测试框架集成,如JUnit、TestNG等,也可以与其他模拟库如EasyMock、Mockito配合使用,以满足不同测试需求。 总之,JMock是Java开发者进行单元测试的重要工具,它通过提供模拟和预期机制,帮助确保...
jMock可以与Mockito、EasyMock等其他模拟框架配合使用,形成互补,提供更全面的测试解决方案。同时,它也可以与Mockrunner、PowerMock等工具结合,用于模拟静态方法、final类等特殊情况。 总结来说,jMock 2.4.0-...
本文将详细探讨如何使用三种流行的Java单元测试框架:jMock、Mockito和EasyMock,并通过"teste-unitario:使用单元测试框架的例子"这个项目,帮助你理解和应用这些工具。 1. **jMock**:jMock是一个用于创建和执行...
3. **非期望-执行-验证模式**:与EasyMock或jMock等框架不同,Mockito采用的是非期望-执行-验证模式,即先执行业务逻辑再验证模拟对象的交互情况。 #### 如何在Mockito中创建Mocks 在Mockito中创建Mocks非常简单,...
JMock通常与Mockito、EasyMock等其他Java模拟框架相比较。虽然它们的目标相似,但JMock更专注于模拟对象的行为和交互,而不仅仅是方法调用。此外,JMock使用领域特定语言(DSL)来定义期待,使得代码更具可读性。 *...
PowerMock是一种基于现有单元测试框架如EasyMock和Mockito的扩展工具,通过利用自定义类加载器和字节码操纵技术,PowerMock能够突破传统单元测试工具的限制,提供对静态方法、构造方法、私有方法、final方法以及系统...
在传统的单元测试中,我们通常会使用诸如Mockito这样的工具来创建模拟对象,以隔离被测试代码和其依赖。JMock不仅提供了模拟对象的功能,还能记录和验证对象的方法调用,这对于测试驱动开发(TDD)和行为驱动开发...
- 常用的模拟框架有Mockito、jMock等。 - 使用模拟对象可以帮助开发者专注于测试单一组件的行为,而不受其他组件的影响。 - **覆盖测试**: - 覆盖测试是一种度量测试完整性的方法,通常通过统计测试代码覆盖率...
使用Mockito进行单元测试时,可以遵循“given when then”的模式来命名测试方法,并且建议一个测试案例中只包含一个断言。 Mockito的常用注解和方法包括: - @Mock:用来声明一个Mock对象。 - @InjectMocks:自动...
- **与其他工具的比较**: 与PowerMock、Mockito等其他Mock框架相比,jMock提供了更多灵活的配置选项。 #### 三、Selenium:Web应用自动化测试工具 - **定义**: Selenium是一个用于Web应用程序的自动化测试工具。 -...
本文将深入探讨Mock的概念及其在Struts2与Spring框架中的应用,同时也会涉及到JUnit和EasyMock等单元测试工具。 Mock技术的核心是创建虚拟对象,这些对象的行为可以被精确地控制,从而模拟真实系统中的协作对象。在...
5. **JMock和Mockito**:在Eclipse中进行单元测试时,模拟对象技术是必不可少的。JMock和Mockito是两个流行的Java模拟框架,它们允许开发者创建和控制对象的行为,以便在隔离环境中测试代码。 6. **持续集成**:...
在实际应用中,Jmockdata与流行的测试框架如JUnit、TestNG等结合使用,可以大大提高测试代码的编写速度和质量。比如,通过集成Mockito这样的模拟库,可以进一步模拟对象的行为,使得测试更加全面和深入。 在项目...
- **JUnit**:是一个流行的 Java 单元测试框架,虽然不直接提供 mock 功能,但可以与 EasyMock 或 Mockito 等工具结合使用。 - **EasyMock**:是另一个 Java 的模拟库,提供简单的 API 来创建和管理 mock 对象,但它...
2. **Mocking框架比较**:对比不同编程语言中的Mocking库,比如`Mockito`、`EasyMock`、`JMock`等。 3. **基本用法**:展示如何创建和配置Mock对象,以及如何设置预期行为。 4. **使用场景**:讲解Mock在测试中的...
Mock技术在软件开发中扮演着重要的角色,尤其是在单元测试和集成测试中。它允许开发者模拟复杂的依赖关系,以便测试特定的代码片段而不受其他部分的影响。在这个“mock学习交流”主题中,我们将深入探讨Java环境下的...
源码部分可能展示了如何在实际项目中创建和使用mock对象,而工具部分可能介绍了流行的mocking框架,如上述的Moq和Mockito,以及其他如PowerMock、JMock等。 在单元测试中,mock对象常用于测试驱动开发(TDD)和行为...
在这个主题中,我们将深入探讨Java编程中的测试实践,包括单元测试、集成测试以及如何使用各种Java测试框架。 在Java编程中,测试是确保代码质量、可维护性和可靠性的重要步骤。主要的测试方法有: 1. **单元测试*...