web-dev-qa-db-fra.com

Utilisation de ReflectionTestUtils.setField () dans les tests Junit

Je suis nouveau dans JUnittesting, donc j'ai une question. Quelqu'un peut-il me dire, s'il vous plaît, pourquoi nous utilisons ReflectionTestUtils.setField() dans nos tests Junit avec exemple.

9
user5459039

Comme mentionné dans le commentaire, la documentation Java explique très bien l'utilisation. Mais je veux vous donner aussi un exemple simple. 

Disons que vous avez une classe Entity avec un accès au champ privé ou protégé et la méthode de définition fournie no fournie

@Entity
public class MyEntity {

   @Id
   private Long id;

   public Long getId(Long id){
       this.id = id;
   }
}

Dans votre classe de test, vous ne pouvez pas définir une id de votre entity en raison de la méthode de définition manquante.

En utilisant ReflectionTestUtils.setField, vous pouvez le faire à des fins de test:

ReflectionTestUtils.setField(myEntity, "id", 1);

Les paramètres sont décrits:

public static void setField(Object targetObject,
                            String name,
                            Object value)
Set the field with the given name on the provided targetObject to the supplied value.
This method delegates to setField(Object, String, Object, Class), supplying null for the type argument.

Parameters:
targetObject - the target object on which to set the field; never null
name - the name of the field to set; never null
value - the value to set

Mais essayez et lisez les docs .

14
Patrick

c'est très utile quand on veut écrire des tests unitaires, tels que:

class A{
   int getValue();
}

class B{
   A a;
   int caculate(){
       ...
       int v = a.getValue();
       ....
   }
}

class ServiceTest{
   @Test
   public void caculateTest(){
       B serviceB = new B();
       A serviceA = Mockito.mock(A.class);
       Mockito.when(serviceA.getValue()).thenReturn(5);
       ReflectionTestUtils.setField(serviceB, "a", serviceA);
   } 
}
1
brice jiang