2016-08-09 85 views
0

Ich habe eine URL-Klasse testen, die URL zu validierenEinheit Testfall MockRestServiceServer erwartete URL funktioniert nicht mit RestTemplate

class ValidateUrl { 
    public Integer validateUrl(String url, int timeOut) throws Exception { 
     String url; 
     private RestTemplate restTemplate = new RestTemplate(); 
     try { 
      ((SimpleClientHttpRequestFactory)restTemplate.getRequestFactory()).setConnectTimeout(1000 * timeOut); 
      ResultClass result = restTemplate.postForObject(url, null, ResultClass.class); 
      if(result!= null) { 
       return result.getErrorCode(); 
      } 

     } catch (Exception e) { 
      log.error("Error"+ e); 
     } 
     return -1; 

    } 
} 

ich habe einen Testfall Testklasse erstellen ValidateUrlTest wo ich die URL am Validieren

@Autowire 
private ValidateUrl validateUrlInstance 

private String url = "https://testingurl.com"; 
private String result = "{\"result\" : \"-1\"}"; 

@Test 
public void validateUrlTest() throws Exception{ 
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); 
    RestTemplate template = new RestTemplate(factory); 
    MockRestServiceServer server = MockRestServiceServer.createServer(template); 
    server.expect(requestTo(url)) 
      .andRespond(given()); 
    int i= validateUrlInstance.validateUrl(url, 2); 
    server.verify(); 

} 

aber immer java.lang.AssertionError: Weitere Anfrage (n) erwartet [testng] 0 von 1 wurden

ausgeführt

Antwort

1

Die Instanz von RestTemplate, die Sie verspotten, ist nicht die in ValidateUrl Klasse verwendete.

Sie sollten es injizieren, anstatt es gerade in der Methode zu intanciating.

public class ValidateUrl { 

    private RestTemplate restTemplate; 

    @Autowired 
    public ValidateUrl(RestTemplate restTemplate) { 
     this.restTemplate = restTemplate; 
    } 

    public Integer validateUrl(String url, int timeOut) throws Exception { 
    ... 
    } 
} 
+0

https://objectpartners.com/2013/01/09/rest-client-testing-with-mockrestserviceserver/ schauen Sie bitte das Beispiel diese auch nicht RestTemplate instanziiert, ich habe viele MockRestServiceServer Beispiel gesehen, wo sie sind autowire nur die RestTemplate; ( –

+0

Ja, das ist genau das, was ich in dem Beispiel sage, dass Sie mir die RestTemplate injiziert wird (mit Spring @Autowired), aber in Ihrem Code ist RestTemplate innerhalb Ihrer Service-Methode installiert und nicht injiziert. – Matt