返回

如何在方法中验证创建的对象的方法调用?

java

## 验证在方法内部创建的对象中的方法调用

场景

在测试中,你可能需要验证在一个方法内部创建的对象中的方法是否被调用。例如,你有一个 Foo 类,它在 foo 方法中创建了一个 Bar 对象并调用 someMethod 方法。你要验证在调用 foo 之后,someMethod 被调用了一次。

解决方法

使用 Mockito,你可以通过以下步骤验证这一行为:

1. 创建 Foo 类模拟对象

Foo foo = Mockito.mock(Foo.class);

2. 捕获内部创建的对象

使用 ArgumentCaptor 来捕获内部创建的对象:

ArgumentCaptor<Bar> barCaptor = ArgumentCaptor.forClass(Bar.class);

3. 验证 Foo 方法

验证 foo 方法被调用了一次:

Mockito.verify(foo, times(1)).foo();

4. 验证内部对象的方法

barCaptor 中获取内部对象,然后对其进行验证:

Bar bar = barCaptor.getValue();
Mockito.verify(bar, times(1)).someMethod();

代码示例

完整的测试代码如下:

@Test
public void testVerifyMethodCalledOnObjectCreatedWithinMethod() {
    Foo foo = Mockito.mock(Foo.class);
    ArgumentCaptor<Bar> barCaptor = ArgumentCaptor.forClass(Bar.class);

    Mockito.verify(foo, times(1)).foo();

    Bar bar = barCaptor.getValue();
    Mockito.verify(bar, times(1)).someMethod();
}

常见问题解答

Q:我必须捕获内部创建的对象吗?

A:是的,你需要使用 ArgumentCaptor 来捕获对象,以便对其方法进行验证。

Q:我可以验证多个内部对象的方法吗?

A:是的,你可以使用多个 ArgumentCaptor 来捕获和验证多个内部对象。

Q:我可以在方法内验证多个方法调用吗?

A:是的,你可以使用 verify 方法并指定调用次数来验证多个方法调用。

Q:我可以用其他框架来验证这种行为吗?

A:是的,还有其他框架可以用来验证这种行为,如 JMockit 和 PowerMock。

Q:这种方法适用于所有对象创建场景吗?

A:不,这种方法仅适用于在方法内部创建的对象。对于在类构造函数或静态方法中创建的对象,需要使用其他技术来进行验证。