2017-12-31 69 views
0

Ich habe einen Testfall für Dao-Implementierung.
Testklasse-Code -Spring Boot Dao Test

@RunWith(SpringRunner.class) 
@RestClientTest({XyzDaoImpl.class}) 
@TestPropertySource(locations = "classpath:application-test.properties") 
public class XyzDaoTest { 

    @Autowired 
    XyzDaoImpl xyzDaoImpl; 

    @Test 
    public void testGetXyzDetails(){ 
     assertThat(xyzDaoImpl.getXyzDetails("123", null)).isNotNull(); 
    } 
} 

xyzDaoImpl.getXyzDetails Methodenimplementierung ruft ein Backend RestTemplate.
Dieser Test funktioniert gut, wenn meine Config-Klasse Code enthält -

@Bean 
public RestTemplate restTemplate() { 
    return new RestTemplate(); 
} 

aber wenn ich den Rest Vorlage Builder erstellen Timeout usw. zu setzen, schlägt fehl Test -

@Bean 
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) { 
    return restTemplateBuilder 
      .setConnectTimeout(timeout) 
      .build(); 
} 

Versuchte Bean mit @Profile Erstellen ("Test") Standard und @Profile ("! Test") - benutzerdefinierte Einstellung, noch Test fehlschlägt.
Fehler ist -

testException = java.lang.AssertionError: No further requests expected: HTTP POST http://... url. 

Antwort

0

Wenn mit @RestClientTest läuft, RestTemplate von RestTemplateBuilder zurückgekehrt sind keine echten Kunden. Sie sind mit einem gefälschten Server verbunden (MockRestServiceServer), der mit den erwarteten Anforderungen und den entsprechenden Antworten eingerichtet werden muss.

Der vorherige Test mit new RestTemplate() ist ein tatsächlicher Client, der mit einem Netzwerk kommuniziert.

Wenn Sie möchten RestTemplateBuilder eine RestTemplate generieren, um mit einem echten Server zu sprechen, können Sie @RestClientTest ausziehen.

Wenn Sie RestTemplateBuilder eine verspottete RestTemplate erzeugen wollen, die zu einem MockRestServiceServer spricht,

  • Verwenden @RestClientTest
  • -Setup die MockRestServiceServer
  • Verwenden RestTemplateBuilder ein RestTemplate zu erzeugen, und die Anforderungen in der konfigurierten senden vorheriger Schritt.

Wie folgt:

@RunWith(SpringRunner.class) 
@RestClientTest({XyzDaoImpl.class}) 
@TestPropertySource(locations = "classpath:application-test.properties") 
public class XyzDaoTest { 
    @Autowired 
    private MockRestServiceServer server; 

    @Before 
    public void setUp() throws Exception {    
      this.server.expect(requestTo("/...url")) 
       .andRespond(withSuccess("{\"status\": \"ok\"}", MediaType.APPLICATION_JSON)); 
    } 

    @Test 
    public void testGetXyzDetails(){ 
     assertThat(xyzDaoImpl.getXyzDetails("123", null)).isNotNull(); 
    } 
} 

class XYZDaoImpl { 
    @Autowired 
    RestTemplate client; 
    String getXyzDetails(String a, String b) { 
     return client.getForObject("/...url", String.class); 
    } 
} 
+0

@RestClientTest Pflege dieser nahm zu entfernen. Danke – chappalprasad

+0

Wenn ich @RunClientTest wie oben für Komponententest halte, kann ich nicht mehr ApplicationContext Fehler laden.
Änderung, die ich tat, wurde unten in Setup-Methode
Server = MockRestServiceServer.createServer (neue RestTemplate());
Auch ausprobiert, einschließlich Klassen, die in XYZDaoImpl Autorisiert sind. Nach dem Hinzufügen von EnabledWebMvc bekomme ich keine Bean java.servlet.ServletContext – chappalprasad

+0

'ServletContext' wird von @WebAppConfiguration zur Verfügung gestellt. Es wird versucht, einen zu finden, da Sie eine Komponente mit @EnableWebMvc in Ihrem Komponenten-Scan-Pfad haben. Sie können die Komponente entweder mit @EnableWebMvc ausschließen oder eine andere mit einer @ WebAppConfiguration hinzufügen. – sabertiger