У меня есть класс, который я хочу протестировать, который имеет несколько внешних зависимостей и несколько внутренних методов.Я хотел бы написать тест для 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 при создании макета для этого метода, чего не должно быть.
Спасибо зазаранее за помощь!