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

时间:2018-01-20 14:12:48

标签: java amazon-s3 mockito junit4 powermock

根据我的要求,我必须使用预先签名的URL将文件上传到Amazon S3,我从AWS网站获取了代码,但是我现在必须编写JUnit。使用PowerMockito来模拟java.net。网址但它根本不起作用。以下是我的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;
    }

}


JUnit的

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", "{}");

    }
}

1 个答案:

答案 0 :(得分:2)

@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", "{}");
}