当前位置: 首页 > 知识库问答 >
问题:

springboot中的PowerMockito模拟私有方法

明星剑
2023-03-14

我试图在测试的类中模拟一个私有方法,如下所示。

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

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

现在我需要测试ProcPayment方法和mockPrivate atemethod

我尝试创建间谍的上述类,但该方法得到调用时,我这样做下面

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在第二行本身被调用。而且,私有方法不会被模仿。

也许我用错误的方式创建了间谍对象?无法执行spy(新设备checkoutserviceinpl()) 因为它需要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'

让我知道我做错了什么。


共有3个答案

崔琦
2023-03-14

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使用了伟大的字节伙伴。

闾丘选
2023-03-14

问题解决了!忘记在测试类上添加@准备测试(DeviceCheckoutServiceImpl.class)

苏季同
2023-03-14

在测试类中,我们将调用org的spy()方法。powermock。应用程序编程接口。莫基托。PowerMockito通过将引用传递给需要测试的类:

MockPrivateMethodExample spy = PowerMockito.spy(mockPrivateMethodExample);

然后定义调用这个特定私有方法时要执行的操作。

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

xample.java

public class MockPrivateMethodExample {

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

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

est.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/

 类似资料:
  • 我有一门课看起来像这样: 我想使用Mockito和Powermock为此编写一个单元测试。我知道我可以这样模仿私有方法: 但是我如何告诉它抛出异常呢?我知道会是这样的: 那里有什么? 请注意,异常是一个私有内部类,因此我不能只执行,因为从单元测试中无法访问。

  • 有人能帮帮我吗?提前谢了。

  • 我试图模拟一个私有方法(executeGetRequest),在我声明要为私有方法返回的模拟的那一行中,私有方法实际上是用null参数执行的,因此抛出了一个NullPointerException。 VlcPlayerMinimal。爪哇: VlcPlayerMinimalTest。爪哇: 堆栈跟踪: 它似乎PowerMockito实际上是调用的方法,我试图在行PowerMockito.do返回(

  • 问题内容: 我正在尝试模拟私有静态方法。见下面的代码 这是我的测试代码 但是我运行的每个瓦片都会出现此异常 我想我在嘲弄东西时做错了什么。有什么想法我该如何解决? 问题答案: 为此,您可以使用和。 此外,您必须在测试类中指定PowerMock运行器,并准备要进行测试的类,如下所示: 希望对您有帮助。

  • 使用PowerMockito模拟私有方法的泛型参数的正确方法是什么?