问题描述
我需要在不更改方法本身的情况下测试以下方法.该方法对服务器执行POST方法.但是我需要制作一个独立于服务器的测试用例.
I need to test the following method with out altering the method itself.The method makes a POST method to a server. But I need to make a test case that's independent from the server.
在将其重定向到本地文件之前,我测试了类似的方法.但是为此,我将协议作为文件,将主机名作为localhost,将端口作为-1.
I tested a similar method before redirecting it to a local file.But that for that I was giving protocol as file, hostname as localhost and port as -1.
我的问题是,此方法执行发布并转换为HttpURLConnection和wr = new DataOutputStream(conn.getOutputStream());无法通过http处理本地txt文件.
My problem is that this method does a post and casts to HttpURLConnection and wr = new DataOutputStream(conn.getOutputStream()); wont work on an local txt file through http.
//构造函数
public HTTPConnector(String usr, String pwd, String protocol,
String hostname, int port) {
this.usr = usr;
this.pwd = pwd;
this.protocol = protocol;
this.hostname = hostname;
this.port = port;
// connect();
}
//我需要测试的方法
public String doPost(String reference, String data) throws IOException {
URL url = null;
HttpURLConnection conn = null;
BufferedReader rd = null;
DataOutputStream wr = null;
InputStream is = null;
String line = null;
StringBuffer response = null;
url = new URL(protocol, hostname, port, reference);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Authorization", "Basic dGVzdDphc2Rm");
conn.setRequestProperty("Content-Type", "application/xml");
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);
// Send response
wr = new DataOutputStream(conn.getOutputStream());
wr.writeBytes(data);
wr.flush();
wr.close();
// Get response
is = conn.getInputStream();
rd = new BufferedReader(new InputStreamReader(is));
response = new StringBuffer();
while ((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
return response.toString();
}
//我可以测试的方法
public String doGet(String reference) throws IOException {
connect();
URL url = new URL(protocol, hostname, port, reference);
InputStream content = (InputStream) url.getContent();
BufferedReader xml = new BufferedReader(new InputStreamReader(content));
return xml.readLine();
}
推荐答案
这是一个示例测试.请注意,我所做的断言是出于演示目的,您需要适应您的需求.
Here's a sample test. Note that assertions I made are for demo purposes, you need to adapt to your needs.
@RunWith(PowerMockRunner.class)
@PrepareForTest({ toTest.class, URL.class, HttpURLConnection.class })
public class soTest {
/**
* test response.
*/
private static final String TEST_RESPONSE = "test\nresponse";
/**
* test data.
*/
private static final String DATA = RandomStringUtils.randomAscii(125);
/**
* test port.
*/
private static final int PORT = 8080;
/**
* test hosts.
*/
private static final String HOSTNAME = "hostname";
/**
* test protocol.
*/
private static final String PROTOCOL = "http";
/**
* test reference.
*/
private static final String REFERENCE = "REFERENCE";
/**
* URL mock.
*/
private URL url;
/**
* HttpURLConnection mock.
*/
private HttpURLConnection connection;
/**
* Our output.
*/
private ByteArrayOutputStream output;
/**
* Our input.
*/
private ByteArrayInputStream input;
/**
* Instance under tests.
*/
private toTest instance;
@Before
public void setUp() throws Exception
{
this.url = PowerMockito.mock(URL.class);
this.connection = PowerMockito.mock(HttpURLConnection.class);
this.output = new ByteArrayOutputStream();
this.input = new ByteArrayInputStream(TEST_RESPONSE.getBytes());
this.instance = new toTest(PROTOCOL, HOSTNAME, PORT);
PowerMockito.whenNew(URL.class).withArguments(PROTOCOL, HOSTNAME, PORT, REFERENCE).thenReturn(this.url);
}
@Test
public void testDoPost() throws Exception
{
PowerMockito.doReturn(this.connection).when(this.url).openConnection();
PowerMockito.doReturn(this.output).when(this.connection).getOutputStream();
PowerMockito.doReturn(this.input).when(this.connection).getInputStream();
final String response = this.instance.doPost(REFERENCE, DATA);
PowerMockito.verifyNew(URL.class);
new URL(PROTOCOL, HOSTNAME, PORT, REFERENCE);
// Mockito.verify(this.url).openConnection(); // cannot be verified (mockito limitation)
Mockito.verify(this.connection).getOutputStream();
Mockito.verify(this.connection).setRequestMethod("POST");
Mockito.verify(this.connection).setRequestProperty("Authorization", "Basic dGVzdDphc2Rm");
Mockito.verify(this.connection).setRequestProperty("Content-Type", "application/xml");
Mockito.verify(this.connection).setUseCaches(false);
Mockito.verify(this.connection).setDoInput(true);
Mockito.verify(this.connection).setDoOutput(true);
Mockito.verify(this.connection).getInputStream();
assertArrayEquals(DATA.getBytes(), this.output.toByteArray());
assertEquals(TEST_RESPONSE.replaceAll("\n", "\r") + "\r", response);
}
}
@Data
public class toTest {
private final String protocol, hostname;
private final int port;
public String doPost(String reference, String data) throws IOException
{
// your method, not modified
}
}
依赖项:
- commons-lang 2.5
- powermock-api-mockito 1.4.11
- powermock-module-junit4 1.4.11
- junit 4.10
- 经测试的课程中的龙目岛0.11.0
这篇关于Java Junit测试HTTP POST请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!