代码之家  ›  专栏  ›  技术社区  ›  Anirudh Jadhav

无法模拟java。网URL,甚至使用PowerMock?

  •  1
  • Anirudh Jadhav  · 技术社区  · 7 年前

    根据我的要求,我必须使用预先签名的URL将一个文件上传到Amazon S3,我从AWS网站上获得了该URL的代码,该网站对我有用,但现在我必须为我使用PowerMockito模拟java的相同URL编写JUnit。网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;
        }
    
    }
    


    朱尼特

    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 回复  |  直到 7 年前
        1
  •  3
  •   udalmik    7 年前
    @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", "{}");
    }