总结下这几天初步学习mock的心得. 文中大部分内容来自官网文档.
创建Mock对象
|
Mockery context = new Mockery();
Turtle turtle = context.mock(Turtle.class);
Turtle turtle2 = context.mock(Turtle.class, "turtle2");
|
创建Mock Expections
|
... create mock objects ...
public void testSomeAction() {
... set up ...
context.checking(new Expectations() {{
... <expections block> ...
}});
... call code being tested ...
}
|
expections 这里指的是jmock在不同情况下的预期值。expections 是jmcok的最重要部分之一。可以模拟用户在不同情况下返回不同的结果。
<expections block>这里是可以设置多个expections 。
Expectations
expections的结构如下:
|
invocation-count (mock-object).method(argument-constraints);
inSequence(sequence-name);
when(state-machine.is(state-name));
will(action);
then(state-machine.is(new-state-name));
|
上面是一个通用的结构。所有expecions都采用相同或更简洁的结构。
invocation-count |
mock调用频率。oneOf表示调用一次后这个expections即失效。 |
mock-object |
mock对象。即上面Mockery创建的对象。 |
method |
用mock代替实现接口的一个方法。所以mock必须使用接口编程。 |
argument-constraints |
mock参数条件。即mock指定方法的参数。 |
when … will…then … |
类似于if .. else… 这样的语句。简单的条件表达式 |
action |
mock符合条件后,执行操作。一般是返回结果。或者抛出异常 |
state-machine |
条件表达式。 |
下面详细讲解下expectations各个部分。
Invocation Count
oneOf |
只执行一次 |
exactly(n).of |
执行指定n次 |
atLeast(n).of |
至少执行n次 |
atMost(n).of |
最多执行n次 |
between(min,max).of |
可以执行min-max次 |
allowing |
允许执行,不受限制 |
ignoring |
功能同allowing类似。这里主要字面上区分allowing |
never |
不允许执行 |
Actions
will(returnValue(v)) |
返回一个值。Object类型任意。集合类型不建议这里返回。虽然也可以 |
will(returnIterator(c)) |
返回一个集合类型的值。 |
will(returnIterator(v1, v2, …,vn)) |
返回一个集合类型的值。可以用多个,来分隔。 |
will(throwException(e)) |
抛出一个异常。 |
will(doAll(a1, a2, …, an)) |
嵌套执行多个actoin。不常用。 |
Sequences
设定mock方法调用的顺序。简单的看下面代码片段。
定义了先save后countUser。调用的时候也必须找这个顺序。否则用例失败。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public void testCountUserSequences() {
final Sequence testSequence = mockery.sequence("testSequence");
final User _user = genUser();
mockery.checking(new Expectations() {
{
oneOf(userDao).save(_user);
inSequence(testSequence);
will(returnValue(_user));
oneOf(userDao).countUser();
inSequence(testSequence);
will(returnValue(1));
}
});
assertEquals(userService.save(_user).getUsername(), "fengsage");
assertEquals(userService.countUser(), 1);
}
|
转自:http://fredzhu.com/2011/12/jmock2-notes-2/
分享到:
相关推荐
2. **模拟与验证**:Jmock允许你创建模拟对象来替代真实的依赖,这样可以避免在测试中引入不必要的复杂性。同时,它还提供强大的验证机制,确保在测试过程中对象交互符合预期。 3. **灵活的匹配器**:Jmock支持多种...
**JMock 深度解析** JMock 是一个流行的开源测试框架,专为Java开发者设计,用于模拟对象的行为,特别是在单元测试中。它允许程序员在不依赖真实对象的情况下测试代码,提高了测试的效率和隔离性。这篇详尽的讨论将...
2. **期望(Expectations)**:这是JMock的核心,用于定义模拟对象在测试期间应如何响应方法调用。你可以设定何时、何地以及如何响应这些调用。 3. **验证(Verification)**:测试完成后,JMock会验证模拟对象在...
通过这个文档,开发者可以学习如何创建和配置模拟对象,设置和验证期待,以及如何在JUnit等测试框架中集成jMock。 首先,创建模拟对象通常需要使用`Mockery`类,这是jMock的核心类。开发者可以通过`context.mock...
通过《JMock Cookbook》的学习,开发者可以了解到如何在实际项目中有效地利用JMock进行测试驱动开发(TDD)和行为驱动开发(BDD),提高代码质量,减少回归错误,并提升开发效率。这本书详细讲解了各种场景下的最佳实践...
2. 期待(Expectations):在测试中,你需要指定模拟对象应该如何被调用,这被称为期待。例如,你可以设置一个期待,表示模拟对象的某个方法应该被调用一次,或者返回特定的值。 3. 验证(Verification):在测试...
2. **期望(Expectations)**:这是JMock的核心,它定义了模拟对象在测试期间应该如何被调用。你可以设定方法调用的顺序、参数、返回值甚至是抛出的异常。 3. **验证(Verification)**:在测试结束时,JMock会检查...
【jmock-2.6.0-jars】这个压缩包主要包含了`jmock`库的2.6.0版本的jar文件以及相关的源代码。`jmock`是Java平台上的一个模拟框架,它允许开发者在单元测试中创建和控制对象的行为,以便能够隔离测试并精确地指定期望...
尽管后来有更新的版本发布,如 JMock 2 和 JMockit,但每个版本都有其适用的场景。1.2.0 版本可能适用于那些需要向后兼容旧项目或者不希望使用新特性的情况。 7. **安装与使用** 要使用 JMock,你需要将对应的 jar...
2. **JMock的核心概念** - **Expectations(期望)**:在测试中定义模拟对象的行为,指定何时以及如何响应方法调用。 - **Matchers(匹配器)**:用于指定方法参数的预期值,如`anyInt()`表示任何整数。 - **...
2. **定义行为**:通过`expect`方法来设定模拟对象的预期行为,如`context.checking(new Expectations() { { oneOf(mock).myMethod(with(any(String.class))); } });` 3. **执行测试**:在测试代码中使用模拟对象,...
jMock 2: Java 5 and above. Stable: 2.5.1 Binary JARs (includes the source to let IDEs provide context-sensitive help) Javadocs Unstable: 2.6.0-RC2 Binary JARs (includes the source to let IDEs ...
而JMock和EasyMock则是两种广泛使用的Java单元测试框架,它们允许开发者模拟对象的行为和交互,以便于测试复杂的系统。本资源包含JMock 2.5.1和EasyMock 3.0的库文件,使得开发者在进行单元测试时无需再四处寻找相关...
Maven-Central / jmock / jmock-cglib 1.2.0 Maven-Central / org.apache.activemq / activemq-ra 5.2.05.1.0 Maven-Central / org.apache.maven.shared / maven-dependency-tree 1.21.1 Maven-Central / org.apache...
JMock is a library that supports test-driven development1 of Java2 code with mock objects3. Mock objects help you design and test the interactions between the objects in your programs.
学习并熟练掌握JMock,将极大地提升单元测试和集成测试的效率和质量。 总之,JMock是Java开发中的一个重要工具,特别是在进行单元测试和集成测试时。结合Spring的测试模块,我们可以更有效地编写和执行测试,确保...