PowerMockito在spring boot中模拟私有方法

问题描述 投票:0回答:3

我正在尝试在我的类中测试一个私有方法,如下所示。

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在第二线本身被召唤。此外,the privateMethod没有被嘲笑。

也许我以错误的方式创建间谍对象?不能做spy(new DeviceCheckoutServiceImpl());因为它需要bean实例化。

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'

让我知道我在这里做错了什么。

spring-boot junit mockito powermock powermockito
3个回答
1
投票

在测试类中,我们将通过将引用传递给需要测试的类来调用org.powermock.api.mockito.PowerMockito的spy()方法:

MockPrivateMethodExample spy = PowerMockito.spy(mockPrivateMethodExample);

然后我们定义在调用这个特定的私有方法时我们想要做什么。

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

mock private method example.Java

public class MockPrivateMethodExample {

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

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

mock private method test.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
投票

Mockito介绍了AdditionalAnswers.delegatesTo来支持对Spring代理和其他类似事件的间谍:

看看这个问题:https://github.com/mockito/mockito/issues/529#issuecomment-239494581

因此,而不是spy(proxy)使用mock(TestSubject.class, delegatesTo(springProxy))

但是,如果需要阅读注释,那么您将需要mockito 2 beta。因为mockito 1.x使用的CGLIB不会复制mockito子类上的注释。 Mockito 2使用了很棒的bytebuddy。


0
投票

问题解决了!忘记在测试课上添加@PrepareForTest(DeviceCheckoutServiceImpl.class)了。

© www.soinside.com 2019 - 2024. All rights reserved.