我正在尝试存根特定类的实例方法,以便当此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实现这个目标吗?谢谢!
答案 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
如果您希望Foo
在Bar
的任何实例上调用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"));
}