Powermockito不模拟静态方法

问题描述

我有这个测试班:

@ExtendWith(SpringExtension.class)
@RunWith(powermockrunner.class)
@PrepareForTest({Staticclass.class})
public class ClassNameTest {

    @InjectMocks
    private ClassNameTest classNameTest;
    
    @Mock
    private DependencyClass dependencyClass;
    
    /* Other dependencies annotated with @Mock */

    @Test
    public void testFunction() {
    
        /* Mocking of the dependencies using Mockito.when() and friends. */
        
        powermockito.spy(Staticclass.class);
        powermockito.when(Staticclass.function(Mockito.any()).thenReturn(/* The object function returns */);
        
        /* Rest of the test code. */
    
    }

}

我正在测试的函数在一行中的某处如下所示:

ReturnObject ro = Staticclass.function(parameter);

很显然,我想要防止被调用的Staticclass并返回特制对象。是的,我知道这个静态类不是最好的方法,但这超出了我当前问题的范围。

我的问题是,在调试测试代码时,它实际上在调用powermockito.when时进入了Staticclass.function,但在那里失败,因为以某种方式输入的值为空。

我看过的所有教程和指南都说这基本上是我需要做的,所以我在这里完全迷路了。有什么想法吗?

解决方法

您是否正在使用JUnit 5或4运行测试?目前尚不清楚,因为您同时使用@ExtendWith(JUnit5批注)和@RunWith(JUnit4)。

  • 如果您使用的是JUnit 5,则暂时不支持PowerMock。 @RunWith(PowerMockRunner.class)被忽略,@PrepareForTest({StaticClass.class}) 无效,因此StaticClass未初始化。
  • 使用JUnit 4,该测试应能按预期工作,尽管@ExtendWith(SpringExtension.class)无法正常工作。