2016-05-13 20 views
0

Ich versuche, Tests für eine Klasse zu schreiben, die eine HttpClient Version 4.5 verwendet. Die Tests, die ich geschrieben habe, sind sehr langsam, also habe ich versucht, das Problem zu isolieren. Ich könnte einen Test schreiben, das mein Problem zeigen:HttpClient und LocalServerTestBase ist wirklich langsam

public class RequeteurRESTTest extends LocalServerTestBase { 

    private String startServer(String urlSuffix, HttpRequestHandler handler) throws Exception{ 
     this.serverBootstrap.registerHandler(urlSuffix, handler); 
     HttpHost target = start(); 
     String serverUrl = "http://localhost:" + target.getPort(); 
     return serverUrl; 
    } 

    @Test 
    public void testCase() throws Exception{ 
     String baseURL = startServer("/api", new HttpRequestHandler() { 
      @Override 
      public void handle(HttpRequest request, HttpResponse response,  HttpContext context) throws HttpException, IOException { 
       response.setStatusCode(HttpStatus.SC_OK); 
      } 
     }); 

     HttpClient httpClient; 
     httpClient = HttpClients.custom().build(); 

     HttpGet method = new HttpGet(baseURL + "/api"); 
     HttpResponse response = httpClient.execute(method); 
    } 
} 

Das Problem, das ich habe, ist, dass der Befehl:

httpClient.execute(method) 

nimmt 10 Sekunden auszuführen. Das ist sehr langsam, aber ich kann nicht herausfinden, warum das so langsam ist. Habe ich bei meinem Test einen Fehler gemacht oder etwas vergessen?

+0

es richtig ausführen Hat? d. h. wird der getestete Server aufgerufen? –

+0

Der Handler wird korrekt aufgerufen, ja –

Antwort

0

Das ist wahrscheinlich, weil Sie nichts mit dem Antwortobjekt tun. Zumindest soll man es schließen.

+0

Was meinst du mit "soll es schließen"? –

+0

http://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html/fundamentals.html#d5e145 – oleg

+0

Einfach dem Tuto gefolgt, scheint aber nicht besser zu sein. Danke trotzdem –

0

Aus einem Grund kann ich nicht nachvollziehen, arbeitet die Httpclient der Basisklasse mit feinen, wie folgt:

@Test 
public void testCase() throws Exception{ 
    String baseURL = startServer("/api", new HttpRequestHandler() { 
     @Override 
     public void handle(HttpRequest request, HttpResponse response,  HttpContext context) throws HttpException, IOException { 
      response.setStatusCode(HttpStatus.SC_OK); 
     } 
    }); 

    HttpGet method = new HttpGet(baseURL + "/api"); 
    HttpResponse response = this.httpclient.execute(method); 

} 
1

Wenn Sie sich den Quellcode von LocalServerTestBase Klasse suchen, können Sie die folgende Methode sehen :

@After 
public void shutDown() throws Exception { 
    if(this.httpclient != null) { 
     this.httpclient.close(); 
    } 

    if(this.server != null) { 
     this.server.shutdown(10L, TimeUnit.SECONDS); 
    } 

} 

Durch Überschreiben in Ihrem eigenen Testfall können Sie das Timeout auf 0 Sekunden setzen. Dies sollte die Verzögerung beseitigen, die Sie in der Ausführung sehen.

Beispielimplementierung:

public class MyClassTest extends LocalServerTestBase{ 
    HttpHost httpHost; 
    @Before 
    public void setUp() throws Exception { 
     super.setUp(); 
     this.serverBootstrap.registerHandler("/*", new HttpRequestHandler() { 
     @Override 
     public void handle(HttpRequest request, HttpResponse response, HttpContext context) 
          throws HttpException, IOException { 
      System.out.println(request.getRequestLine().getMethod()); 
      response.setStatusCode(HttpStatus.SC_OK);     
     } 

     }); 

     httpHost = start(); 

    } 

    @Test 
    public void myMethodTest() throws Exception { 
     //Create an instance and give the server url it should call 
     MyClass instance = new MyClass(httpHost.toURI()); 
     //Test method that calls the server 
     instance.myMethod(); 
    } 

    @After @Override 
    public void shutDown() throws Exception { 
    if(this.httpclient != null) { 
     this.httpclient.close(); 
    } 
    if(this.server != null) { 
     this.server.shutdown(0L, TimeUnit.SECONDS); 
    } 
    } 

} 
Verwandte Themen