web-dev-qa-db-de.com

Verwendung von ReflectionTestUtils.setField () beim Junit-Test

Ich bin neu in JUnittesting, also habe ich eine Frage. Kann mir jemand bitte sagen, warum wir ReflectionTestUtils.setField() in unserem Junit-Test mit Beispiel verwenden.

9
user5459039

Wie im Kommentar erwähnt, erklären die Java-Dokumente die Verwendung sehr gut. Aber ich möchte Ihnen auch ein einfaches Beispiel geben. 

Nehmen wir an, Sie haben eine Entitätsklasse mit privatem oder geschütztem Feldzugriff und keine angegebene Setter-Methode

@Entity
public class MyEntity {

   @Id
   private Long id;

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

In Ihrer Testklasse können Sie aufgrund der fehlenden Setter-Methode keine id Ihrer entity setzen.

Mit ReflectionTestUtils.setField können Sie das zu Testzwecken tun:

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

Die Parameter werden beschrieben:

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

Aber probieren Sie es aus und lesen Sie die docs .

14
Patrick

es ist sehr nützlich, wenn wir Unit-Tests schreiben möchten, wie zum Beispiel:

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