我有一个我想测试的类,它有几个外部依赖项,还有几个内部方法。我想为MethodA
编写一个测试,但是不让方法A对MethodB
进行内部调用以实际练习MethodB
。我想模拟/存根MethodB
并返回一些特定的东西。通常我会使用when/thenReturn
,但它的行为并不像我预期的那样 - 它实际上是在创建模拟本身时跳转到方法B中。
MyService.java
@Service
public class MyService {
@Autowired
private ServiceA serviceA;
@Autowired
private ServiceB serviceB;
public SomeObject methodA() {
// some logic using serviceA.method and serviceB.method that creates "output"
SomeObject someObject = methodB(output);
return someObject;
}
public SomeObject methodB(SomeObject someObject) {
// deep mysteries done here to someObject
return someObject
}
}
MyServiceTest.java
public class MyServiceTest {
@Mock
private ServiceA serviceA;
@Mock
private ServiceB serviceB;
@InjectMocks
private MyService myService;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void methodATest() {
when(serviceA.method()).thenReturn(stuff);
when(serviceB.method()).thenReturn(otherStuff);
// here is what I would like to do
when(myService.methodB()).thenReturn(mockedSomeObject); //<- doesn't work
assertThat(myService.methodA().getSomeObjectProperty())
.isEqualTo("property");
}
}
我已经查看了使用MyService
手动模拟Mockito.mock(MyService.class)
类的解决方案,但是(因为上面的示例显然是做作的)我的实际类有很多外部依赖项,我更喜欢一个解决方案仍然允许我使用@Mock
为@Autowired
依赖项和@InitMocks
模拟服务,除非它根本不可能。
我试过了:
Mockito.doReturn(mockedSomeObject).when(myService.methodB(any(SomeObject.class));
但是在为该方法创建模拟时也会进入MethodB,这不应该发生。
提前感谢您的帮助!
答案 0 :(得分:5)
尝试将@Spy添加到InjectMocks并使用该对象以稍微不同的语法“期望”它们。
import org.mockito.Spy;
@InjectMocks
@Spy
private MyService myService;
现在模拟服务电话
Mockito.doReturn(mockedSomeObject).when(myService).methodB();
同时更改对此
的其他模拟调用Mockito.doReturn(stuff).when(serviceA).method();
Mockito.doReturn(otherStuff).when(serviceB).method();
答案 1 :(得分:0)
您需要将对象标记为Spy,或使用MyClass objA=null;
MyClass spy_objA=Powermockito.spy(objA)
doReturn(what_you_want).when(spy_objA).method()
编辑:可以找到您可能想要检查的类似问题 How to mock another method in the same class which is being tested?