Comment puis-je simuler une variable de champ qui est initialisée en ligne?
class Test {
private Person person = new Person();
...
public void testMethod() {
person.someMethod();
...
}
}
Ici, je veux me moquer person.someMethod()
en testant la Test.testMethod()
méthode pour laquelle je dois me moquer de l'initialisation de la person
variable. Un indice?
Edit: je ne suis pas autorisé à modifier la classe Person.
Person
. Les options incluent l'ajout d'un constructeur pour ce faire ou l'ajout d'une méthode de définition.Réponses:
Mockito est livré avec une classe d'assistance pour vous faire économiser du code de plaque chauffante de réflexion:
Mise à jour: Malheureusement, l'équipe mockito a décidé de supprimer la classe dans Mockito 2. Vous êtes donc de retour à l'écriture de votre propre code passe-partout de réflexion, utilisez une autre bibliothèque (par exemple Apache Commons Lang ), ou dérobez simplement la classe Whitebox ( sous licence MIT ).
Mise à jour 2: JUnit 5 est livré avec ses propres classes ReflectionSupport et AnnotationSupport qui pourraient être utiles et vous éviter de tirer dans une autre bibliothèque.
la source
internal
package et ne semble plus fonctionner sur Mockito 2.6.2.Assez tard à la fête, mais j'ai été frappé ici et j'ai obtenu l'aide d'un ami. Le problème était de ne pas utiliser PowerMock. Cela fonctionne avec la dernière version de Mockito.
Mockito vient avec ça
org.mockito.internal.util.reflection.FieldSetter
.Ce qu'il fait essentiellement, c'est vous aider à modifier les champs privés à l'aide de la réflexion.
Voici comment vous l'utilisez:
De cette façon, vous pouvez passer un objet fictif et le vérifier plus tard.
Voici la référence.
la source
FieldSetter
n'est plus disponible dans Mockito 2.x.Class#getDeclaredField
accepte le paramètre unique, donc les parenthèses doivent ressembler à ceciFieldSetter.setField(underTest, underTest.getClass().getDeclaredField("person"), mockedPerson);
. C'est ainsi que je me suis trompé et j'ai pensé que ce serait peut-être une bonne idée de le corriger dans votre exemple. Merci d'avoir répondu.Si vous utilisez Spring Test, essayez org.springframework.test.util.ReflectionTestUtils
la source
testImplementation("org.springframework:spring-test:5.1.2.RELEASE")
J'ai déjà trouvé la solution à ce problème que j'ai oublié de poster ici.
Les points clés de cette solution sont:
Exécution de mes cas de test avec PowerMockRunner:
@RunWith(PowerMockRunner.class)
Demandez à Powermock de se préparer
Test.class
à la manipulation des champs privés:@PrepareForTest({ Test.class })
Et enfin moquez-vous du constructeur de la classe Person:
PowerMockito.mockStatic(Person.class);
PowerMockito.whenNew(Person.class).withNoArguments().thenReturn(person);
la source
mockStatic
fonction, mais cela n'est pas représenté dans votre exemple de code. L'exemple de code doit-il avoir l'mockStatic
appel, ou n'est-ce pas obligatoire pour les constructeurs?Le code suivant peut être utilisé pour initialiser le mappeur dans la maquette du client REST. Le
mapper
champ est privé et doit être défini lors de la configuration du test unitaire.la source
En utilisant le guide de @ Jarda, vous pouvez définir ceci si vous devez définir la variable sur la même valeur pour tous les tests:
Mais sachez que définir des valeurs privées différentes doit être manipulé avec précaution. S'ils sont privés, c'est pour une raison quelconque.
Exemple, je l'utilise, par exemple, pour modifier le temps d'attente d'un sommeil dans les tests unitaires. Dans les exemples réels, je veux dormir pendant 10 secondes, mais dans le test unitaire, je suis satisfait si c'est immédiat. Dans les tests d'intégration, vous devez tester la valeur réelle.
la source