Mockito参数匹配器的实现使用了Hamcrest框架(一个书写匹配器对象时允许直接定义匹配规则的框架,网址:http://code.google.com/p/hamcrest/)。它已经提供了许多规则供我们使用, Mockito在此基础上也内建了很规则。但有时我们还是需要更灵活的匹配,所以需要自定义参数匹配器。
ArgumentMatcher抽象类
自定义参数匹配器的时候需要继承ArgumentMatcher抽象类,它实现了Hamcrest框架的Matcher接口,定义了describeTo方法,所以我们只需要实现matches方法在其中定义规则即可。
下面自定义的参数匹配器是匹配size大小为2的List:
class IsListOfTwoElements extends ArgumentMatcher<List> {
public boolean matches(Object list) {
return ((List) list).size() == 2;
}
}
@Test
public void argumentMatchersTest(){
List mock = mock(List.class);
when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true);
mock.addAll(Arrays.asList("one", "two", "three"));
verify(mock).addAll(argThat(new IsListOfTwoElements()));
}
argThat(Matcher<T> matcher)方法用来应用自定义的规则,可以传入任何实现Matcher接口的实现类。上例中在stubbing和verify addAll方法时通过argThat(Matcher<T> matcher),传入了自定义的参数匹配器IsListOfTwoElements用来匹配size大小为2的List。因为例子中传入List的元素为三个,所以测试将失败。
较复杂的参数匹配将会降低测试代码的可读性。有时实现参数对象的equals()方法是个不错的选择(Mockito默认使用equals()方法进行参数匹配),它可以使测试代码更为整洁。另外,有些场景使用参数捕获器(ArgumentCaptor)要比自定义参数匹配器更加合适。
分享到:
相关推荐
- **匹配器(Matchers)**:允许你使用Hamcrest匹配器来定义方法参数,提供更灵活的验证和stubbing。 - **部分mocks**:有时你可能希望只模拟对象的一部分行为,而让其他行为保持真实。Mockito支持这种功能。 - **...
- **自定义参数匹配器**:可以通过创建自己的`ArgumentMatcher`类来实现特定的匹配逻辑。 - **比较匹配器**:如`equalTo()`、`is()`、`not()`等,用于精确地匹配值。 - **复合值匹配器**:如`either()`、`both()`...
#### 自定义参数匹配器 除了内置的参数匹配器外,还可以定义自定义的`ArgumentMatcher`。例如: ```java private static class IsPositive implements ArgumentMatcher<Integer> { @Override public boolean ...
- **构建自定义匹配器**:可以创建自己的匹配器来满足特定的测试需求。 #### 二、参数化测试 - **创建参数化测试**:允许为同一个测试方法提供多组数据,从而减少重复代码。 - **参数化构造器**:通过 `@RunWith...
10. **Mockito匹配器**:Mockito是一个流行的Java单元测试框架,它也支持使用匹配器来验证方法调用。例如,可以使用`ArgumentMatchers`中的`eq()`, `any()`, `anyString()`等方法来设置期望的mock行为。 总的来说,...
- `any()`, `anyString()`, `anyInt()` 等匹配器可以匹配任何参数。 此外,如果需要 mock 静态方法、私有函数或者构造函数,可以结合使用 PowerMock 这个扩展库。它允许你创建更复杂的 mock 场景,但使用时需谨慎,...
9. **Hamcrest匹配器**:JUnit 4常常结合Hamcrest库,提供更丰富的断言方式。 10. **@TestTimeout**:限制测试方法的执行时间,防止因为死循环等问题导致的长时间运行。 11. **.junit.extensions**:JUnit 4支持...
- **匹配器**:使用EasyMock提供的匹配器(如`eq()`、`anyObject()`等)可以精确控制方法参数的匹配条件。 - **顺序模拟**:如果多个对象之间有特定的调用顺序,可以通过`EasyMock.sequence()`来指定。 **5. ...
- 异常处理:try-catch-finally语句块、自定义异常。 - 集合框架:ArrayList、LinkedList、HashMap、HashSet的区别和使用。 - 内存管理:垃圾回收机制、引用类型(强引用、软引用、弱引用、虚引用)。 - 多线程:...
配合`hamcrest-core-1.3.jar`,这是一个匹配器库,它提供了丰富的断言工具,与JUnit结合使用,可以让测试表达更加清晰和强大。Hamcrest的匹配器可以在断言中提供更精确的比较,比如`Matchers.anything()`、`Matchers...
1. `hamcrest-core-1.3.jar`:这是Hamcrest库的核心模块,提供了一套匹配器(Matcher)来定义预期结果。Hamcrest是JUnit中用于断言的库,它的API设计使得编写表达性强、易于理解的断言变得更加方便。 2. `hamcrest-...
JUnit4常与Hamcrest库结合使用,提供更强大的匹配器来验证方法调用。同时,Mockito库可以用来创建和配置假对象,模拟依赖关系,使得测试更加隔离。 10. **测试监听器(Test Listeners)** 通过实现JUnit的`...
### Spring AOP 学习知识点详解 #### 一、Spring AOP 原理 **Spring AOP**(面向切面编程)是 Spring 框架中的一个关键特性,它提供了一种优雅的方式来处理横切关注点(cross-cutting concerns)。在实际应用中,...
此外,Hamcrest还支持正则表达式匹配、集合操作以及自定义匹配器,极大地增强了我们的断言能力。 结合JUnit 4.12和Hamcrest Core 1.3,我们可以编写出更加清晰、强大的测试代码。例如,下面是一个简单的示例,展示...
JUnit 4.10推荐使用Hamcrest库进行更精确的断言,它的匹配器能提供更清晰、更具表达力的测试语句。 10. **JUnit Runner**: JUnit 4.10允许自定义测试运行器,这为测试执行策略提供了更多的灵活性。例如,可以...
- **Hamcrest**:提供丰富的匹配器,增强断言表达能力。 - **PowerMock**:扩展JUnit,可以模拟静态方法、构造函数、final类和方法、删除静态初始化器等。 6. **版本更新**:JUnit 4.11之后,还发布了4.12等后续...
JUnit 4.11 版本引入了一些新特性,比如支持Hamcrest匹配器,使得断言更加灵活。同时,它改进了参数化测试,允许测试方法接收一组参数,从而可以一次性执行多个相似的测试。此外,还加强了对注解的支持,例如`@Rule`...
7. **Hamcrest集成**:JUnit 4.11与Hamcrest匹配器库紧密集成,提供了一种声明式的方式来编写断言,使得测试表达更直观。 8. **与其它库的兼容性**:JUnit 4.11能够与其他Java测试库如Mockito、PowerMock等良好协作...