2012-05-17 27 views
11

Yöntemi değiştirerek aşağıdaki yöntemi test etmem gerekiyor. Yöntem, bir sunucuya bir POST yöntemi yapar. Ama sunucudan bağımsız bir test durumu yapmam gerekiyor.Java Junit testi HTTP POST isteği

Yerel bir dosyaya yönlendirmeden önce benzer bir yöntemi test ettim. Ama bunun için dosya olarak protokol, localhost olarak hostname ve -1 portu veriyordum.

Sorunum, bu yöntemin bir gönderi yapması ve HttpURLConnection ve wr = new DataOutputStream (conn.getOutputStream()); http yoluyla yerel bir txt dosyasında çalışmaz.

// Yapıcı

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(); 
    } 

// Ben

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(); 
    } 

// yöntem test etmek gerek yöntem ben

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(); 
    } 
+0

Sahte nesnelere baktınız mı? – buymypies

+0

wel herhangi bir yerel bir yere gitmiyor, bu yüzden nasıl yönlendirileceğini zor buluyorum. yerel bir dosyaya veya sınıfa yönlendirmek için bir yol bulabilirsem, o zaman bir iş yapabilirdim, ancak görebildiğim tek yol yerel bir sunucu/iş parçacığı yapmak. fakat bu, testlerimi sunucuya yönlendirmem, veriyi almak için ihtiyaç duyduğum sunucu ve kendi kendine ihtiyaç duyduğu sunucuyu talep etmek için programlanmalı ve o kadar verimli ve verimli çalışıyor. – Gabain1993

cevap

6

Aşağıda örnek testi var test edebilir. Yaptığım iddiaların demo amaçlı olduğunu, ihtiyaçlarınızı karşılamanız gerektiğini unutmayın.

@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 
    } 
} 

bağımlılıkları:

  • commons-lang 2.5
  • powermock-api-Mockito 1.4.11
  • powermock-modül-junit4 1.4.11
  • junit 4.10
  • lombok 0.11.0, test edilmiş sınıfta
+1

iyi bir sollution gibi görünüyor, ama bir hata alıyorum ve nasıl çözeceğimi bilmiyorum belki biraz ışık tutabilirsiniz: org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner çözülemez. Dolaylı olarak \t başvurulan .class dosyalarından başvurulan – Gabain1993

+0

Bu sınıf "powermock-module-junit4" tarafından sağlanmıştır, bu garip. Sınıf yolunu kontrol etmelisin –

5

Test edilen yöntemi tekrar gözden geçirme fırsatınız yoksa, yeni bir yaklaşım, kullandığı HttpUrlConnection ile uyumlu olacaktır. İlk elden bu zor görünmektedir çünkü HttpUrlConnection bir parametre olarak girilmemiştir. Bununla birlikte, url.openConnection'dan döndürülen bağlantıyı kontrol ederek bunu kontrol edebilirsiniz.

Bu, kurucuya ilettiğiniz protokol için java.net.URL ile kaydedilen protokol işleyici tarafından yönetilir. Hile yeni bir protokol işleyicisi kaydettirmek (detaylar için bkz. Java - Registering custom URL protocol handlers).

Yeni protokol işleyiciniz, sınamada kullanabileceğiniz bir HttpUrlConnection alaylı döndürmelidir.

İlgili konular