2017-02-23 3 views
0
@RunWith(MockitoJUnitRunner.class) 
public class FeatureFlipperManagerTest { 
    @Autowired 
    RestTemplate restTemplate = new RestTemplate(); 
    @Autowired 
    Service service = new Service(); 
    MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate); 

    @Test 
    public void test() throws Exception { 
     mockServer.expect(requestTo(Mockito.anyString())) 
       .andRespond(withSuccess("{\"enabled\":true}", MediaType.APPLICATION_JSON)); 
     boolean res = service.isEnabled("xxx"); 
     mockServer.verify(); 
     Assert.assertEquals(true, res); 
    } 
} 

Ich habe MockRestServiceServer zu mock restTemplete in einem Dienst. Aber es scheitert immer. Es zeigt den Fehler java.lang.AssertionError: Further request(s) expected 0 out of 1 were executed an. Jeder könnte mich wissen lassen, wo ich es nicht richtig gemacht habe.Wie verspottete RestTemplet mit MockRestServiceServer?

Der Service selbst wird sieht wie folgt aus:

public class Service{ 
    public boolean isEnabled(String xxx) { 
     RestTemplate restTemplate = new RestTemplate(); 
     ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class); 
     if(...)return true; 
     return false; 
    } 
} 

Antwort

0

Zu allererst Ihre Service Klasse erstellt eine neue Instanz von RestTemplate bei jeder Anfrage. Ich kann nicht genug betonen, wie schlecht es ist. Erstellen Sie eine Bean vom Typ RestTemplate und injizieren Sie sie in Ihre Service-Bean (sie ist höchstwahrscheinlich bereits erstellt - abhängig von der Spring MVC-Version, die Sie verwenden).

Wenn Sie es haben, dann werden beide RestTemplates: eine in Ihrer Service Bohne und ein in FeatureFlipperManagerTest injiziert werden die gleichen sein und mit MockRestServiceServer Prüfung möglich sein wird.

EDIT - sein expliziter:

Ändern Sie bitte Ihre Service Klasse:

@Component 
public class Service { 

    private RestTemplate restTemplate; 

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

    public boolean isEnabled(String xxx) { 
     ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class); 
     if(...)return true; 
     return false; 
    } 
} 

und Ihre Testklasse:

@RunWith(MockitoJUnitRunner.class) 
public class FeatureFlipperManagerTest { 
    @Autowired 
    RestTemplate restTemplate; 

    @Autowired 
    Service service; 

    MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate); 

    @Test 
    public void test() throws Exception { 
     mockServer.expect(requestTo(Mockito.anyString())) 
       .andRespond(withSuccess("{\"enabled\":true}", MediaType.APPLICATION_JSON)); 
     boolean res = service.isEnabled("xxx"); 
     mockServer.verify(); 
     Assert.assertEquals(true, res); 
    } 
} 

Wenn dies mit Ausnahme nicht sagen, dass es no RestTemplate Bean vorhanden dann bitte Informationen über die Version von Spring (Spring Boot?) einfügen, die Sie verwenden.

+0

Ich nehme an, dass dein Kommentar der richtige ist, obwohl ich nicht sicher bin, wie ich mein Problem beheben kann. Wenn ich keine restTemplate-Bean erstellen kann. Gibt es noch etwas, was ich tun kann, um einen Rest zu verspotten? und eigentlich muss ich nur die Antwort eines Anrufs verspotten. Gibt es das überhaupt, um das zu tun? – c2340878

0

Ich denke, Sie meinen, Sie möchten RestTemplate verwenden, die von Feder zur Verfügung gestellt wird, so sollten Sie nach der Feder autowired die RestTemplate erstellen. Ich denke du kannst es so machen:

@RunWith(MockitoJUnitRunner.class) 
public class FeatureFlipperManagerTest { 
    @Autowired 
    RestTemplate restTemplate; 

    Service service; 
    MockRestServiceServer mockServer; 

    @Before 
    public void init() { 
     service = new Service(); 
     service.setRestTemplate(restTemplate); 
     // If you have autowired restTemplate in Service, you can just autowired the service 
     mockServer = MockRestServiceServer.createServer(restTemplate); 
    } 

    @Test 
    public void test() throws Exception { 
     mockServer.expect(requestTo(Mockito.anyString())) 
       .andRespond(withSuccess("{\"enabled\":true}", MediaType.APPLICATION_JSON)); 
     boolean res = service.isEnabled("xxx"); 
     mockServer.verify(); 
     Assert.assertEquals(true, res); 
    } 
} 
+0

Ich kann keine Methode namens setRestTemplate (restTemplate) finden. Warum? – c2340878

Verwandte Themen