【发布时间】:2018-06-04 15:19:29
【问题描述】:
我有一个要测试的类,它有几个外部依赖项和几个内部方法。我想为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");
}
}
我查看了使用 Mockito.mock(MyService.class) 手动模拟 MyService 类的解决方案,但是(因为上面的示例显然是人为的)我的实际类有很多外部依赖项,我更喜欢一个仍然允许我使用 @Mock 来模拟服务,使用 @Autowired 依赖项和 @InitMocks 来模拟被测类,除非它根本不可能。
我试过了:
Mockito.doReturn(mockedSomeObject).when(myService.methodB(any(SomeObject.class));
但在为该方法创建模拟时也会进入 MethodB,这不应该发生。
提前感谢您的帮助!
【问题讨论】: