2017-06-23 2 views
0

Je suis en train de tester mes services SpringBoot avec Mockito. Le problème est que certains des services que je teste ont des dépendances multiples avec d'autres services et référentiels, ce qui rend difficile l'exécution d'un test sur des niveaux plus profonds du service.Comment tester un Service avec un référentiel Mocked qui a plusieurs autres dépendances (services et repos)?

Par exemple:

La classe "TestService" contient la méthode ci-dessous:

public Test addTagToTest(Long id, Long tagId) { 
    Tag tag = tagService.getById(tagId); 
    Test test = getById(id); 

    test.addTag(tag); 
    return update(test); 
} 

Cette classe a une dépendance avec "TagService". Remarque: chaque service a son propre référentiel.

Et c'est la classe de service qui est utilisé par TestService:

@Service 
public class TagService extends GenericAbstractService<Tag, TagRepo> { 
    public Tag getTagByName(String tagName){ 

Dans mon JUnit classe de test qui contient la méthode @Test, j'ai quelque chose comme ceci:

@Autowired 
private TestService testService; 

@Mock 
private TestRepo repository; 

Donc la question est maintenant comment tester mon TestService qui a des dépendances qui ont des dépendances? Tous les dépôts doivent être raillés.

+1

Est-ce que vous chargez le contexte de printemps pour les tests ou simplement les tests unitaires? –

+0

Voir le https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-jpa-test – Sudhakar

Répondre

3

Vous n'avez pas besoin de vous moquer de tous. Se moquer d'une couche de classes est suffisant. Test Service appelle TagService.getById(). Dans ce cas, TagService effectue un appel de méthode à un référentiel et obtient le résultat. Nous pouvons simuler TagService.getById(). Pour être plus précis avec Mockito,

@Mock 
private TagService tagService; 

@Test 
public void yourTest() { 
    doReturn(<tag object you want>) 
      .when(tagService).getById(); 
} 

Dans ce cas, TagService.getById ne soit pas réellement appelé. Il renvoie directement ce que vous voulez retourner. Vous n'avez donc pas à vous inquiéter du référentiel autowired dans TagService. J'espère que cela t'aides.

+0

Vous avez Souvenez-vous également d'ajouter l'annotation @RunWith (MockitoJUnitRunner.class) à votre classe, ou ajoutez une méthode avec l'annotation @Before qui inclura MockitoAnnotations.initMocks (this); –

+1

True. J'essayais de donner une explication à la question pas l'extrait de code réel. – yaswanth

+0

@ 476rick, si cette réponse fonctionne pour vous, pouvez-vous l'accepter? Ou si vous attendez autre chose, veuillez mettre à jour la question. – yaswanth