使用 Powermockito 模拟最终 class 的本地对象创建

Mocking local object creation of a final class using Powermockito

我正在尝试使用 PowerMockito 模拟最终的 class 对象创建。 但它没有考虑模拟对象并创建实际对象,如输出和调试屏幕截图所示。

这里可能遗漏了什么。

请说明。

Class

import java.net.MalformedURLException;
import java.net.URL;

public class Sample {

public void m1(String input) throws IOException {
    URL url = new URL(input);
    URLConnection connection = url.openConnection();
    System.out.println(url);
    System.out.println(connection);
}

}

测试Class

import java.net.URL;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ URL.class })
public class SampleTest {
@Test
public void testM1() throws Exception {
    String input = "http://www.example.com";

    URL url = PowerMockito.mock(URL.class);
    PowerMockito.whenNew(URL.class).withAnyArguments().thenReturn(url);

    Sample sample = new Sample();
    sample.m1(input);
}
}

输出

http://www.example.com
sun.net.www.protocol.http.HttpURLConnection:http://www.example.com

你的测试本身没有任何问题。你唯一缺少的就是这个

@PrepareForTest({ URL.class , Sample.class})

您还需要准备样品 class。除非您准备示例 class,否则 Powermock 不知道它应该代理 class,这意味着它不会干扰其中发生的事情。