I am trying to mock method createInstanceB()
using Mockito.when()
as well as doReturn()
. This always calls real method.
For example:
Class A {
public B createInstanceB(any, any) {
B b = new B();
b.api();
}
}
I am using the code below
import org.mockito.Mockito;
import static org.mockito.Mockito.*;
Class ATest {
A a;
B b;
@Before
Public void setup{
a = A.getInstance();
b = mock(B.class);
}
@Test
public void testCreateInstanceB(){
Mockito.when(a.createInstanceB(any(),any()).thenReturn(b);
...
}
}
I tried doReturn(mock)
as well.
As StvnBrkdll recommended, use a Spy if you're needing to use an actual instance. But that can still call the real method sometimes if using Mockito.when() as you are in your example. As an alternative, look at Mockito.doReturn(). For example using your code: Mockito.doReturn(b).when(a).createInstanceB(any(),any());
This will now only return b
and never call the actual method of createInstanceB
.
Btw, their docs have a section about this. See the part under " Important gotcha on spying real objects! "
The problem with the code is that it is calling Mockito.when()
on an actual instance of A
, not a mock. Mockito.when()
only works with mock objects, not the real thing.
If you need to have methods "mocked" (stubbed) on "real" objects, consider using Mockito.spy()
. For more information on using "spies", see this post .
Something like this will be close to what you want:
Class ATest{
A a ;
A aSpy;
B b;
@Before
Public void setup{
a= A.getInstance();
aSpy = Mockito.spy(a);
b= mock(B.class);
}
@Test
public void testCreateInstanceB(){
Mockito.when(aSpy.createInstanceB(any(),any()).thenreturn(b);
...
}
You will need to use aSpy
, not a
in your test code.
I faced this problem. Both of these methods thenReturn()
and doReturn()
seem to do the same in my case: that is they are calling the actual method. Using stub
worked for me:
PowerMockito.stub(PowerMockito.method(A.class, "createInstance", argtypes)).toReturn(b);
Make sure you mock the constructor of A
as well as using PowerMockito.whenNew()
if you create a new object and add A.class
to @PrepareForTest
.
根据@StvnBrkdll 的回答,在我的情况下,问题是我使用@Autowired
注释而不是@MockBean
作为我试图模拟的方法,这导致调用真正的实现。
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.