Comment se moquer de RestTemplate en Java Printemps?
public class ServiceTest {
@Mock
RestTemplate restTemplate = new RestTemplate();
@InjectMocks
Service service = new Service();
ResponseEntity responseEntity = mock(ResponseEntity.class);
@Test
public void test() throws Exception {
Mockito.when(restTemplate.getForEntity(
Mockito.anyString(),
Matchers.any(Class.class)
))
.thenReturn(responseEntity);
boolean res = service.isEnabled("something");
Assert.assertEquals(res, false);
}
J'ai essayé de tester un test simple pour un service, y compris un restclient. Il semble que je n'ai pas se Moquer de la RestTemplate
avec succès. Il ressemble au code obtenir les données réelles pas de la fantaisie. Quelqu'un peut m'aider avec cela.
Le service lui-même regarde comme ceci:
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;
}
}
OriginalL'auteur c2340878 | 2017-02-23
Vous devez vous connecter pour publier un commentaire.
Le problème est que dans votre
isEnabled
vous créez un nouveau RestTemplate. C'est faux, pour deux raisons, la première est que vous ne peut pas s'en moquer, puisque vous êtes la création d'un nouveau, et deuxièmement, il est bon d'éviter de créer de nouveaux objets par demande. RestTemplate est thread-safe et donc peut être un service membre de la classe, être utilisée dans de nombreux threads.Changer votre classe de service à quelque chose comme ceci:
Maintenant que votre RestTemplate est devenu un membre de la classe, vous pouvez maintenant correctement simulé par le biais de deux manières différentes. L'un, pour l'injecter à l'aide de la
@InjectMock
, ou utiliser une méthode de définition de ce que vous appelez à partir de votre test.Puisque vous utilisez InjectMock dans votre code on peut aller avec qui.
Avis que j'ai fait quelques changements. Tout d'abord, j'ai enlevé le
new RestTemplate()
etnew Service()
. Vous devriez laisser mockito ceux qui créent pour vous. En annotant avec@Mock
et@Spy
vous devez vous assurer que Mockito créera pour vous, et plus important encore, qui permettra d'injecter les objets fantaisie dans votreservice
objet.OriginalL'auteur Jose Martinez
Spring MVC du framework de test a offert à la classe
MockRestServiceServer
pour les tests unitaires de service RESTful code.Ici est un tutoriel sur son utilisation.
github.com/jeffsheets/MockRestServiceServerExample
comment puis-je faire de ce droit, dans l'annotation du monde?
OriginalL'auteur Keith
Si vous utilisez @Autocâblés, vous pouvez utiliser MockRestServiceServer.
Le ci-dessous en est l'exemple.
@Service doit utiliser @Autocâblés pour la création d'objet automatiquement.
Désolé, j'ai manqué de mettre l'importance annotation sur la classe. Veuillez voir ma réponse encore une fois.
OriginalL'auteur hiroyukik