Comment puis-je simuler un autocâblés @Valeur du champ au Printemps avec Mockito?
Je suis en utilisant le Printemps 3.1.4.LIBÉRATION et Mockito 1.9.5. Dans mon Printemps de classe que j'ai:
@Value("#{myProps['default.url']}")
private String defaultUrl;
@Value("#{myProps['default.password']}")
private String defaultrPassword;
//...
De mon JUnit test, j'ai actuellement configuré comme suit:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
public class MyTest
{
Je voudrais simuler une valeur de mon "defaultUrl" sur le terrain. Notez que je ne veux pas de se moquer des valeurs pour les autres domaines — que j'aimerais garder ceux qu'ils sont, seul le "defaultUrl" sur le terrain. Notez également que je n'ai pas explicite "setter" de méthodes (p. ex. setDefaultUrl
) dans ma classe et je ne veux pas créer tout simplement à des fins de test.
Compte tenu de cela, comment puis-je simuler une valeur pour un champ?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser la magie du Printemps
ReflectionTestUtils.setField
afin d'éviter de faire toutes les modifications que ce soit à votre code.Découvrez cette tutoriel pour plus d'informations, bien que vous n'aurez probablement pas besoin, puisque la méthode est très facile à utiliser
Mise à JOUR
Depuis l'introduction de Printemps 4.2.RC1, il est maintenant possible de définir un champ statique, sans avoir à fournir une instance de la classe. Voir cette partie de la documentation et cette commettre.
ReflectionTestUtils.setField(bean, "fieldName", "value");
avant d'appeler votrebean
méthode lors de l'essai.C'est maintenant la troisième fois que j'ai cherché moi-même à cette SORTE de post que j'oublie toujours comment simuler un @champ de Valeur. Si l'on a accepté la réponse est correcte, j'ai toujours besoin d'un peu de temps pour obtenir le "setField" appel, au moins pour moi, je coller un exemple extrait ici:
De Production de classe:
De la classe de Test:
Vous pouvez aussi simuler votre propriété de configuration dans votre classe de test
Je voudrais suggérer une solution connexe, qui est de passer le
@Value
annotée champs en tant que paramètres au constructeur, au lieu d'utiliser leReflectionTestUtils
classe.Au lieu de cela:
et
Ce faire:
et
Avantages de cette approche: 1) nous pouvons instancier la classe Foo sans une dépendance conteneur (c'est juste un constructeur), et 2) nous ne sommes pas de couplage notre test pour nos détails de mise en œuvre (réflexion liens nous le nom du champ à l'aide d'une chaîne, ce qui pourrait causer un problème si on change le nom du champ).
Vous pouvez utiliser cette magie du Printemps de Test annotation :
voir
org.springframework.test.contexte.TestPropertySource
Par exemple, c'est la classe de test :
Et c'est la classe avec la propriété :
J'ai utilisé le code ci-dessous et cela a fonctionné pour moi:
Référence: https://www.jeejava.com/mock-an-autowired-value-field-in-spring-with-junit-mockito/
Une façon de résoudre ce problème est de changer votre classe à utiliser Constructeur Injection, qui est utilisée pour les tests de Printemps et d'injection. Pas plus de réflexion 🙂
Ainsi, vous pouvez passer n'importe quel Chaîne à l'aide du constructeur:
Et dans votre test, il suffit de l'utiliser: