2017-04-05 2 views
1

J'ai une méthode de service avec restTemplate. Dans le cadre du test unitaire, j'essaie de me moquer, mais d'une certaine manière, comment échouer.Test d'unité simulé pour RestTemplate

service Méthode:

@Autowired 
private RestTemplate getRestTemplate; 

return getRestTemplate.getForObject(restDiagnosisGetUrl, SfdcCustomerResponseType.class); 

Méthode d'essai:

private CaresToSfdcResponseConverter caresToSfdcResponseConverter; 

    @Before 
    public void setUp() throws Exception { 
     caresToSfdcResponseConverter = new CaresToSfdcResponseConverter(); 

    } 
    @Test 
    public void testConvert(){ 
    RestTemplate mock = Mockito.mock(RestTemplate.class); 
     Mockito.when(mock.getForObject(Matchers.anyString(), Matchers.eq(SfdcCustomerResponseType.class))).thenReturn(sfdcCustomerResponseType); 
} 
sfdcRequest = caresToSfdcResponseConverter.convert(responseForSfdcAndHybris); 

Il donne NullPointerException. On dirait qu'il ne parvient pas à se moquer du modèle de repos et il se brise là comme le modèle de repos est nul.

Répondre

1

Il ne manque pas de se moquer du modèle de repos, mais il n'injecte pas le modèle de repos simulé à votre classe de production. Il y a au moins deux façons de résoudre ce problème.

Vous pouvez modifier votre code de production et use constructor injection. Déplacez le RestTemplate au constructeur en tant que paramètre et vous pouvez simplement passer la maquette dans le test:

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

Dans votre test, vous simplement créer le service comme tout autre objet et transmettre votre modèle reste moqué.

Ou vous pouvez changer votre test pour injecter votre service en utilisant l'annotation suivante:

@RunWith(MockitoJUnitRunner.class) 
public class MyServiceTest { 
    @InjectMocks 
    private MyService myService; 

    @Mock 
    private RestTemplate restTemplate; 

    @Test 
    public void testConvert(){ 
     Mockito.when(mock.getForObject(Matchers.anyString(), Matchers.eq(SfdcCustomerResponseType.class))).thenReturn(sfdcCustomerResponseType); 
    } 
} 

Vous pouvez voir un exemple dans une autre question SO: Using @Mock and @InjectMocks

Je préfère généralement l'injection de constructeur.

+0

Merci @ sm4. Cela a parfaitement fonctionné. J'ai essayé cette façon d'injecter des simulacres au départ mais de toute façon ça ne fonctionnait pas. Donc changé d'autres en suivant une recherche dans google. Merci encore. – arjun