Mockito:类的所有实例的模拟实例方法

时间:2017-09-12 21:18:17

标签: java junit mockito

我正在尝试存根特定类的实例方法,以便当此Foo类的任何实例调用此实例方法doSomething时,返回相同的object(见下面的代码)。但是,mockito不允许任何匹配者在验证或存根之外。

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实现这个目标吗?谢谢!

1 个答案:

答案 0 :(得分:4)

这应该有效:

 public class FooTest {
     @Mock
     private Foo foo;

     ...
     @Before
     public void setUp() {
        MockitoAnnotations.initMocks(this);
     }

     @Test
     public void testSomething() {
        Bar object = new Bar();
        when(foo.doSomething(any(Any.class))).thenReturn(object);
        ...
     }
}

更新1

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

@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"));
    }
}

即使调用Bar,此示例也将返回相同的Baz对象。这是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"));
}