即使使用 PowerMock 也无法模拟 java.net.URL?

Not able to mock java.net.URL even by using PowerMock?

根据我的要求,我必须使用预签名 URL 将文件上传到 Amazon S3,为此我从 AWS 网站获得了对我有用的代码,但现在我必须编写 JUnit对于我使用 PowerMockito 模拟 java.net 的相同内容。 URL 但它根本不起作用。以下是我的 Java 代码加上无法正常工作的 JUnit。任何人都可以给我解决方案,我应该如何进行?提前致谢。
我的代码:-

public class App {
    public Boolean uploadToS3(String presignedUrl, String jsonBody) {
        try {
            URL url = new URL(presignedUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestMethod("PUT");
            OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
            out.write(jsonBody);
            out.close();
            int responseCode = connection.getResponseCode();
            System.out.println("Service returned response code " + responseCode);
            return true;
        } catch (IOException io) {
            io.printStackTrace();
        }
        return false;
    }

}


J单元

import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Matchers;
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,HttpURLConnection.class,OutputStreamWriter.class,OutputStream.class})
public class AppTest
{
    @InjectMocks
    App app;

    @Test
    public void uploadToS3_should_return_true() throws Exception{
        App app = new App();
        //App app = PowerMockito.mock(App.class);
        URL url = PowerMockito.mock(URL.class);
        HttpURLConnection connection = PowerMockito.mock(HttpURLConnection.class);
        OutputStreamWriter outStreamWriter = PowerMockito.mock(OutputStreamWriter.class);
        OutputStream outStream = PowerMockito.mock(OutputStream.class);


        PowerMockito.whenNew(URL.class).withArguments(Matchers.anyString()).thenReturn(url);
        PowerMockito.when(url.openConnection()).thenReturn(connection);
        PowerMockito.whenNew(OutputStreamWriter.class).withArguments(Matchers.any()).thenReturn(outStreamWriter);
        PowerMockito.when(connection.getOutputStream()).thenReturn(outStream);
        PowerMockito.when(connection.getResponseCode()).thenReturn(201);
        app.uploadToS3("http://something.com", "{}");

    }
}

@InjectMocks
App app;

@Mock
URL url;

@Mock
OutputStream outStream;

@Test
public void uploadToS3_should_return_true() throws Exception{
    // no need to create instance of App, it should be initialyzed fine with @InjectMocks annotation
    // define mocked behavior   
    HttpURLConnection connection = PowerMockito.mock(HttpURLConnection.class);
    // mock connection and out stream methods
    PowerMockito.when(url.openConnection()).thenReturn(connection);
    PowerMockito.whenNew(URL.class).withArguments(Matchers.anyString()).thenReturn(url);

    PowerMockito.when(connection.getOutputStream()).thenReturn(outStream);
    PowerMockito.when(connection.getResponseCode()).thenReturn(200);

    // call action
    app.uploadToS3("http://something.com", "{}");
}