欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TestNG 中 使用 PowerMock mock 方法中new的对象

程序员文章站 2022-06-01 16:52:51
...

 

被测试类:

public class FileTest {
    public boolean callInternalInstance(String path) {
        File file = new File(path);
        return file.exists();
    }
}

 

测试方法:

@Test
    public void newTest() {
        File file = PowerMockito.mock(File.class);
        FileTest ft = new FileTest();
        try {
            PowerMockito.whenNew(File.class).withAnyArguments().thenReturn(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
        PowerMockito.when(file.exists()).thenReturn(true);
        Assert.assertEquals(ft.callInternalInstance("abc"), true);

    }

使用Junit的情况下,@PrepareForTest需要跟@RunWith 组合使用 https://*.com/a/31682670/8842183

但如果使用testNG, 没有@RunWith注解

解决方法:

1. @PrepareForTest 注解在测试类上,注解在方法上无效

2. @PrepareForTest ({FileTest.class, File.class}) 注解参数中不仅需要调用类,还需要被实例化的类

3. 测试类继承 PowerMockTestCase

最终的测试类:

@PrepareForTest({FileTest.class, File.class})
public class MoattributeAssignmentApplicationTests extends PowerMockTestCase {

    @Test
    public void newTest() {
        File file = PowerMockito.mock(File.class);
        FileTest ft = new FileTest();
        try {
            PowerMockito.whenNew(File.class).withAnyArguments().thenReturn(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
        PowerMockito.when(file.exists()).thenReturn(true);
        Assert.assertEquals(ft.callInternalInstance("abc"), true);

    }
}

*: https://*.com/a/42588580/8842183

相关标签: mock unit test