2016-08-03 26 views
0

Ich schreibe Integrationstestfälle mit MockMvc, um meine REST API zu testen.Mock ein nicht federgeführtes Objekt beim Integrationstest mit mockMVC

Innerhalb meiner Implementierung der RESTAPI verwende ich intern RestTemplate (nicht direkt vom Controller, sondern innerhalb einer util-Klasse, die der Controller aufruft), um eine REST-API eines Drittanbieters aufzurufen. Die RestTemplate, die ich verwende (um die 3rd Party Rest API zu machen), ist keine Spring Bean, sondern ich instanziiere sie als RestTemplate restTemplate = new RestTemplate();

Ich möchte den restTemplate Aufruf (PostForEntity) verspotten.

Ich versuche, die unten Ansatz:

Mein Test Klassen-

@ContextConfiguration(locations = { 
    "classpath:test-applicationContext.xml" 
}) 
@WebAppConfiguration 

public class MockMVCTest {

private MockMvc mockMvc; 
    private RestTemplate restTemplate 

    @Autowired 
    private WebApplicationContext webApplicationContext; 

    @Before 
    public void setUp() { 
    if (!initalized) { 
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
    restTemplate = (RestTemplate)webApplicationContext.getBean("restTemplate"); 

}

@Test 
public void demo() throws Exception { 
when(
    restTemplate.postForEntity(
    eq("thirdpartyuri"), 
    any(HttpEntity.class), 
    eq(MyClass.class))).thenReturn(myresponse); 

mockMvc.perform(
    post("uriExposedbyme") 
    .contentType(MediaType.APPLICATION_JSON) 
    .accept(MediaType.APPLICATION_JSON) 
    .content(MY_PAYLOAD)).andExpect(status().isOk()); 
} 

In meiner Anwendung-Kontext Ich habe die Fo llowing Mock definiert:

<bean id="restTemplate" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="org.springframework.web.client.RestTemplate" />  </bean> 

Aber wenn ich meine Testfall ausführen die RestTemplate verspottet zu werden, aber wenn ein Aufruf RestTemplate während der Ausführung geschieht die eigentliche resttemplate wird statt meiner mock resttemplate genannt.

Bitte schlagen Sie vor, wie ich RestTemplate für meinen Testfall überspielen kann.

+0

Können Sie Ihre Test-applicationContext.xml –

+0

Hallo Tharsan teilen, das ist mein Test-applicationContext.xml \t : Komponente-Scan-Basis-Paket = "mybasepackage "/> \t \t \t \t \t \t – Ashwini

Antwort

0

Die util-Klasse instanziiert ihre private RestTemplate, wie Sie gesagt haben: RestTemplate restTemplate = new RestTemplate() ;.

Dies bedeutet, dass es verwendet wird, nicht die eine im Test verspottet. Sie können entweder RestTemplate in Ihrem tatsächlichen Quellcode eine federverwaltete Bean erstellen oder eine Setter-Methode für die util-Klasse verwenden und diesen Setter im Test mit der mocked Rest-Vorlage aufrufen.

+0

könnten Sie erarbeiten Sie bitte auf" eine Setter Methode für die Klasse util und rufen Sie diese Setter im Test mit der mocked Rest-Vorlage "mit einem Beispiel. Was ist der Vorteil des Aufrufs einer Setter-Methode für die UUIL-Klasse mit Mocked RESTTemplate. Darüber hinaus kommt die gespottete RestTemplate nicht zum Laufen mein Einzeltest – Ashwini

0

Basierend auf den bereitgestellten Informationen könnte ich sagen, dass Sie die folgenden Änderungen versuchen und prüfen möchten, ob das Problem behoben wurde. Was kann ich sehen, ist da Sie die WebApplicationContext als

@Autowired private WebApplicationContext webApplicationContext; 

autowire könnte es möglich, das Entwicklungsprofil injiziert zu werden, eher Testprofil. Somit können Sie diese Anmerkung setzen die Klasse im Test-Profil an der Spitze der Testklasse

@RunWith(SpringJUnit4ClassRunner.class) 

Noch zu markieren, wenn Sie Fragen haben, Auto Draht die Rest Vorlage korrekt mit Ihrer RestTemplate Instanz wie unten.

@Autowired 
@Qualifier("restTemplate") 
private RestTemplate restTemplate;