PowerMockito макет частных методов в Springboot - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь смоделировать закрытый метод в тестируемом классе, как показано ниже.

public String processPayment(...) {
    //some lines
    privateMethod(...);
    return "";
}

private Object privateMethod(...) {
    //some lines
    return someObject;
}

Теперь мне нужно протестировать processPayment метод и макет privateMethod.

Я пытался создать шпиона вышеупомянутого класса, но метод вызывается, когда я делаю ниже

final DeviceCheckoutServiceImpl spyDeviceCheckoutService = spy(injectedMockBeanOfAboveClass); //@InjectMock in test class
PowerMockito.doReturn(null).when(spyDeviceCheckoutService, "privateMethod", ArgumentMatchers.anyMap()); //method gets called here
spyDeviceCheckoutService.processPayment(...); //private method isn't mocked somehow, and gets called here too

privateMethod вызывается на самой 2-й строке.Кроме того, the privateMethod не является предметом насмешек.

Может быть, я неправильно создаю объект-шпион?Невозможно выполнить spy(new DeviceCheckoutServiceImpl());, так как для этого требуется создание экземпляра компонента.

Версия Powermockito:

compile group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.0'
compile group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.0'

Дайте мне знать, что я делаю здесь неправильно.

Ответы [ 3 ]

1 голос
/ 16 апреля 2019

В тестовом классе мы вызовем метод spy () для org.powermock.api.mockito.PowerMockito, передав ссылку на класс, который необходимо протестировать:

MockPrivateMethodExample spy = PowerMockito.spy(mockPrivateMethodExample);

Затем мы определим, что мы хотим сделать, когдаэтот конкретный частный метод называется.

PowerMockito.doReturn("Test").when(spy, {$methodName});

MockPrivateMethodExample.java

public class MockPrivateMethodExample {

  public String getDetails() {
    return "Mock private method example: " + iAmPrivate();
  }

  private String iAmPrivate() {
    return new Date().toString();
  }
}

MockPrivateMethodTest.java

@RunWith(PowerMockRunner.class)
@PrepareForTest(MockPrivateMethodExample.class)
public class MockPrivateMethodTest {

  private MockPrivateMethodExample mockPrivateMethodExample;

  // This is the name of the private method which we want to mock
  private static final String METHOD = "iAmPrivate";

  @Test
  public void testPrivateMethod() throws Exception {
    mockPrivateMethodExample = new MockPrivateMethodExample();

    MockPrivateMethodExample spy = PowerMockito.spy(mockPrivateMethodExample);
    PowerMockito.doReturn("Test").when(spy, METHOD);
    String value = spy.getDetails();

    Assert.assertEquals(value, "Mock private method example: Test");
    PowerMockito.verifyPrivate(spy, Mockito.times(1)).invoke(METHOD);
  }
}

Подробнее здесь: https://examples.javacodegeeks.com/core-java/mockito/mockito-mock-private-method-example-with-powermock/

0 голосов
/ 16 апреля 2019

Проблема решена! Забыл добавить @PrepareForTest(DeviceCheckoutServiceImpl.class) в тестовый класс.

0 голосов
/ 16 апреля 2019

Mockito представил AdditionalAnswers.delegatesTo для поддержки шпионажа на прокси Spring и других подобных вещах:

Проверьте эту проблему: https://github.com/mockito/mockito/issues/529#issuecomment-239494581

Поэтому вместо spy(proxy) используйте mock(TestSubject.class, delegatesTo(springProxy)).

Однако если необходимо прочитать аннотации, вам понадобится бета-версия mockito 2.Потому что mockito 1.x использует CGLIB, который не копирует аннотации на подкласс mockito.В Mockito 2 используется отличный байтбудди.

...