【问题标题】:Not able to mock java.net.URL even by using PowerMock?即使使用 PowerMock 也无法模拟 java.net.URL?
【发布时间】:2018-01-20 14:12:48
【问题描述】:

根据我的要求,我必须使用预签名 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", "{}");

    }
}

【问题讨论】:

    标签: java amazon-s3 mockito junit4 powermock


    【解决方案1】:
    @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", "{}");
    }
    

    【讨论】:

    • 对我来说效果很好,我刚刚添加了缺少的代码 sn-ps udalmik t q
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    相关资源
    最近更新 更多