如何嘲笑在Java静态方法?(How to mock static method in Java?)

2019-07-21 18:07发布

我有一个类FileGenerator ,我正在写一个测试的generateFile()是应该做下面的方法:

1)它应当调用静态方法getBlockImpl(FileTypeEnum)BlockAbstractFactory

2)它应该填充可变blockList从子类方法getBlocks()

3)它应该调用一个静态方法createFile从最终辅助类FileHelper传递字符串参数

4)它应该调用每个运行方法BlockController在块列表

到目前为止,我有这个空的方法:

public class FileGenerator {
    // private fields with Getters and Setters

    public void generateBlocks() {
    }
}

我使用JUnit,对的Mockito mock对象和我一直在使用PowerMockito嘲笑静态和最后类(没有的Mockito无效)尝试。

我的问题是:我的第一个测试(调用方法getBlockList()BlockAbstractFactory )在流逝,即使是在没有实现generateBlocks() 我已经实现的静态方法BlockAbstractFactory (返回null,至今),以避免Eclipse的语法错误。

我如何可以测试静态方法中调用fileGerator.generateBlocks()

这里是我的测试类,到目前为止:

@RunWith(PowerMockRunner.class)
public class testFileGenerator {
    FileGenerator fileGenerator = new FileGenerator();

    @Test
    public void shouldCallGetBlockList() {
            fileGenerator.setFileType(FileTypeEnum.SPED_FISCAL);

            fileGenerator.generateBlocks();

            PowerMockito.mockStatic(BlockAbstractFactory.class);
            PowerMockito.verifyStatic();
            BlockAbstractFactory.getBlockImpl(fileGenerator.getFileType());
    }
}

Answer 1:

我有PowerMock没有经验,但因为你没有得到答案呢我刚读通过的文件,看看是否我可以帮你的方式有点。

我发现,你需要让我知道它需要准备被嘲笑它的静态方法准备PowerMock。 像这样:

@RunWith(PowerMockRunner.class)
@PrepareForTest(BlockAbstractFactory.class) // <<=== Like that
public class testFileGenerator {
    // rest of you class
}

在这里你可以找到更多信息。

这是否帮助?



Answer 2:

工作示例:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassStaticA.class, ClassStaticB.class})
public class ClassStaticMethodsTest {

    @Test
    public void testMockStaticMethod() {
        PowerMock.mockStatic(ClassStaticA.class);
        EasyMock.expect(ClassStaticA.getMessageStaticMethod()).andReturn("mocked message");
        PowerMock.replay(ClassStaticA.class);
        assertEquals("mocked message", ClassStaticA.getMessageStaticMethod());
    }


文章来源: How to mock static method in Java?