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