java - Mockito:一个类的所有实例的模拟实例方法

标签 java junit mockito

我试图 stub 一个特定类的实例方法,这样当这个 Foo 类的任何实例调用这个实例方法 doSomething 时,相同的 object 被返回(见下面的代码)。但是,mockito 不允许在验证或 stub 之外使用任何匹配器。

Bar object = new Bar();
given(any(Foo.class).doSomething(Arg.class)).willReturn(object);

Foo.class 中:

Bar doSomething(Arg param) {
    Bar bar = new Bar();
    // Do something with bar
    return bar;
}

我可以用 Mockito 实现这个目标吗?谢谢!

最佳答案

如果您希望 Foo 在您调用 doSomething 时返回相同的 Bar 实例,您应该使用 PowerMock Foo 的任何实例上的方法。这是一个例子:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Foo.class)
public class FooMockAllInstanceTest {

    @Test
    public void testMockInstanceofObjectCreation() throws Exception {
        Bar mockBar = PowerMockito.mock(Bar.class);
        when(mockBar.sayHello()).thenReturn("Hi John!");
        PowerMockito.whenNew(Bar.class)
                .withNoArguments()
                .thenReturn(mockBar);

        Foo myFooOne = new Foo();
        assertEquals(mockBar,  myFooOne.doSomething("Jane"));

        Foo myFooTwo = new Foo();
        assertEquals(mockBar,  myFooTwo.doSomething("Sarah"));

        Baz bazOne = new Baz();
        assertEquals(mockBar, bazOne.doSomething("Sam"));

        Baz bazTwo = new Baz();
        assertEquals(mockBar, bazTwo.doSomething("Nina"));
    }
}

即使在调用 Baz 时,此示例也会返回相同的 Bar 对象。这是 Baz 类,

public class Baz {

    public Bar doSomething(String name) {
        Foo foo = new Foo();
        return foo.doSomething(name);
    }
}

更新 2

还有另一种使用 PowerMock 进行测试的稍微好一点的方法。在这里,

@Test
public void testStubbingMethod() throws Exception {
    Bar mockBar = PowerMockito.mock(Bar.class);
    when(mockBar.sayHello()).thenReturn("Hi John!");

    PowerMockito.stub(PowerMockito.method(Foo.class, "doSomething",
            String.class)).toReturn(mockBar);

    Foo myFooOne = new Foo();
    assertEquals(mockBar, myFooOne.doSomething("Jane"));

    Foo myFooTwo = new Foo();
    assertEquals(mockBar, myFooTwo.doSomething("Sarah"));

    Baz bazOne = new Baz();
    assertEquals(mockBar, bazOne.doSomething("Sam"));

    Baz bazTwo = new Baz();
    assertEquals(mockBar, bazTwo.doSomething("Nina"));
}

关于java - Mockito:一个类的所有实例的模拟实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46185469/

相关文章:

java 字符串与数字

java - 内存中的内部类在哪里?

java - 依赖问题 : Java SE-1. 8、JUnit 5、Mockito 4.0 和 PowerMock

android - 模拟 Android AssetManager

java - 正则表达式在文本中查找国家/地区?

java - Spring Batch CommandLineJobRunner 在由企业调度程序运行时挂起

java - Eclipse m2e Junit - mvn-Build 之后 ClassNotFound,或 "maven update project"之后缺少资源

java - 使用 JUnit 进行自动化测试

java - 为 Spring 单元测试注入(inject)模拟 @Service

java - 当我将多个自定义匹配器分配给一个方法时,Mockito 的行为很奇怪