Spring启动在集成测试中使用PowerMock模拟静态方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring启动在集成测试中使用PowerMock模拟静态方法相关的知识,希望对你有一定的参考价值。

我正在SpringBoot中的RestController上编写集成测试。通常我会使用SpringRunner.class运行,但是当涉及Mock静态方法时,我需要使用PowerMock。

奇怪的是,当我运行单个测试时,它们会单独传递(但返回错误消息),当我尝试运行整个测试类时,没有测试通过并返回相同的错误消息。

@RunWith(PowerMockRunner.class)
@PrepareForTest({JwtUtils.class})
//@PowerMockRunnerDelegate(SpringRunner.class) THIS DOESN'T WORK!!!
@SpringBootTest(classes = SpringBootJwtApplication.class)
public class RestAccessIntegrationTest {

  @Autowired @InjectMocks
  RestController restController;

  @Mock
  HttpServletRequest request;

  @Test
  public void operationsPerAccountWhenSuccessfulTest(){
    mockStatic(JwtUtils.class);
    when(JwtUtils.myMethod(request)).thenReturn("blabla");
    String expected = ... ;
    String actual = restController.getOperations();
    assertEquals(actual, expected);
  }

}

如果我运行测试或整个类,我会收到此类错误:

org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.mock: 50)

如果我取消注释@PowerMockRunnerDelegate(SpringRunner.class)那么它会出现另一个错误:

线程“main”中的异常java.lang.NoClassDefFoundError:org / powermock / core / testlisteners / GlobalNotificationBuildSupport $ orback.powermock.modules.junit4.internal.impl.DelegatingPowerMockRunner.run(DelegatingPowerMockRunner.java:139)的回调

以上是关于Spring启动在集成测试中使用PowerMock模拟静态方法的主要内容,如果未能解决你的问题,请参考以下文章

如何用powermockrunner覆盖循环

使用 Testcontainer 进行 Spring 集成测试 - 数据库在应用程序之后启动

我可以在 PowerMock 的单元测试中使用 Cobertura 吗?

使用放心的spring-boot集成测试

使用 PowerMock 分析 JUnit 测试?

单元测试-PowerMock