2017-10-09 2 views
0

Actuellement, j'essaie de travailler avec Mockito combiné avec le repos. Je ne sais pas comment tester ma méthode d'édition en repos avec Mockito et reste. Le dernier bloc de code contient la partie que je ne peux pas comprendre atm. Je n'ai pas travaillé avec Mockito auparavant donc tous les conseils sont les bienvenus.Test d'une fonction d'édition en repos avec mockito - Java EE - JUnit

C'est la fonctionnalité que je veux tester:

@POST 
@Path("edit/{id}") 
@Consumes({MediaType.APPLICATION_JSON}) 
@Produces({MediaType.APPLICATION_JSON}) 
public Profile editProfile(Profile profile, @PathParam("id") Long id){ 
    Profile updatedProfile = profileService.getProfile(id); 
    updatedProfile.setBiography(profile.getBiography()); 
    updatedProfile.setLocation(profile.getLocation()); 
    updatedProfile.setWebsite(profile.getWebsite()); 
    updatedProfile.setAvatar(profile.getAvatar()); 
    updatedProfile.setImage(profile.getImage()); 
    updatedProfile.setUpdated_at(new Date()); 
    return updatedProfile; 
} 

Mise en place mes TestClass ici

Client client; 
WebTarget root; 
static final String PATH = "/MyApp/api/profile/"; 
static final String BASEURL = "http://localhost:8080" + PATH; 
List<Profile> profileList = new ArrayList<Profile>(); 
Profile profile; 

@Mock 
ProfileDao profileDao; 

@InjectMocks 
private ProfileService profileService; 

@Before 
public void setUp() { 
    this.client = ClientBuilder.newClient(); 
    this.root = this.client.target(BASEURL); 
    profile = new Profile(1L,"biography", "location" ,"website","../avatar.jpg","../image.jpg"); 
    for(int i = 0; i < 10; i++){ 
     profileList.add(profile); 
    } 
} 

La fonction de test pour modifier un test:/profil/modifier/1 -/profile/edit/{id}

// This part doesn't work. I'm not sure how to handle this part with mockito and rest 

@Test 
public void editProfileTest() { 
    String mediaType = MediaType.APPLICATION_JSON;   
    when(profileDao.find(1L)).thenReturn(new Profile(1L,"biography", "location" ,"website", "../avatar.jpg","../image.jpg")); 
    final Entity<Profile> entity = Entity.entity(profileService.getProfile(1L), mediaType); 

    Profile profileResult = this.root.path("edit/1").request().post(entity, Profile.class); 
    assertThat(profileResult, is(profile)); // this doesn't match 
} 
+0

Souhaitez-vous créer un test d'intégration (où tester la combinaison de votre méthode, du service, du dao, de la base de données)? Ou voulez-vous tester uniquement la méthode? Comme la méthode ne lit que le Profil et met à jour 6 attributs, je le testerais (si je ne veux pas créer un test d'intégration). –

+0

@NiklasP la question concerne le test de la méthode uniquement. Cependant, je suis également intéressé par un test d'intégration. J'ai trouvé la solution pour le test de la méthode seulement, je l'afficherai ci-dessous comme réponse. Si vous avez une référence ou une solution pour un test d'intégration, cela m'intéresserait aussi. –

+0

Le problème de la partie 'is (profile)' de votre test JUnit est que 'is' compare le pointeur/les adresses des objets du profil s'ils sont les ** mêmes ** (l'équivalent n'est pas suffisant) et votre méthode mockée Crée un ** nouveau ** Profil qui signifie égal mais ** pas ** identique. Le plus simple serait de retourner le profil défini avec 'when (profileDao.find (1L)). ThenReturn (profile); –

Répondre

0

Au début, je n'étais pas vraiment sûr de la façon de rendre le test valide, mais avec le morceau de code suivant, j'ai résolu mon problème.

ajusté mon test de repos/Mockito un peu:

@Test 
public void editProfileTest() { 
    String mediaType = MediaType.APPLICATION_JSON;   
    when(profileDao.find(2L)).thenReturn(profileList.get(0)); 
    final Entity<Profile> entity = Entity.entity(profileService.getProfile(2L), mediaType); 
    Profile profileResult = this.root.path("edit/2").request().post(entity, Profile.class); 
    assertThat(profileResult.getId(), is(profileService.getProfile(2L).getId())); 
    assertThat(profileResult.getUser_id(), is(profileService.getProfile(2L).getUser_id())); 
    assertThat(profileResult.getAvatar(), is(profileService.getProfile(2L).getAvatar())); 
    assertThat(profileResult.getBiography(), is(profileService.getProfile(2L).getBiography())); 
    assertThat(profileResult.getLocation(), is(profileService.getProfile(2L).getLocation())); 
    assertThat(profileResult.getWebsite(), is(profileService.getProfile(2L).getWebsite())); 
    assertThat(profileResult.getImage(), is(profileService.getProfile(2L).getImage())); 
} 

Ce teste la méthode sur/MyApp/profil/modifier/{id} seulement. Si vous avez des exemples pour un test d'intégration ou des références n'hésitez pas à poster à ce sujet. Comme j'essaie d'en apprendre plus sur les tests en général.

+2

Si vous ne voulez pas tester votre profileService, alors je me moquerais de la méthode 'profileService.getProfile (2L)' et laisserais le fantôme renvoyer un profile défini que je comparerais ensuite à 'profileResult'. –