Mockito: макетирование метода того же класса, вызываемого тестируемым методом при использовании @InjectMocks - PullRequest
0 голосов
/ 04 июня 2018

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

Спасибо зазаранее за помощь!

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Попробуйте добавить @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();
0 голосов
/ 04 июня 2018

Вам нужно пометить свой объект как шпион или явно создать объект шпиона для него, используя MyClass objA=null; MyClass spy_objA=Powermockito.spy(objA) doReturn(what_you_want).when(spy_objA).method()

Редактировать: Вы можете найти похожий вопрос, который вы можете захотеть проверить Как смоделировать другой метод втот же класс, который тестируется?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...