J'utilise Spring 3.1.4.RELEASE et Mockito 1.9.5. Dans ma classe de printemps, j'ai:
@Value("#{myProps['default.url']}")
private String defaultUrl;
@Value("#{myProps['default.password']}")
private String defaultrPassword;
// ...
De mon test JUnit, que j'ai actuellement mis en place comme ceci:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
public class MyTest
{
Je voudrais moquer une valeur pour mon champ "defaultUrl". Notez que je ne veux pas simuler les valeurs des autres champs - j'aimerais les garder telles quelles, uniquement le champ "defaultUrl". Notez également que je n'ai pas de méthode "setter" explicite (par exemple setDefaultUrl
) dans ma classe et que je ne veux pas en créer juste à des fins de test.
Compte tenu de cela, comment puis-je me moquer d'une valeur pour ce champ?
ReflectionTestUtils.setField(bean, "fieldName", "value");
avant d'appeler votrebean
méthode pendant le test.C'était maintenant la troisième fois que je me regardais sur ce post SO car j'oublie toujours comment se moquer d'un champ @Value. Bien que la réponse acceptée soit correcte, j'ai toujours besoin de temps pour appeler correctement "setField", donc au moins pour moi, je colle un exemple d'extrait ici:
Classe de production:
Classe de test:
la source
Vous pouvez également simuler la configuration de votre propriété dans votre classe de test
la source
Je voudrais suggérer une solution connexe, qui consiste à transmettre les
@Value
champs -annotés en tant que paramètres au constructeur, au lieu d'utiliser laReflectionTestUtils
classe.Au lieu de cela:
et
Faites ceci:
et
Avantages de cette approche: 1) nous pouvons instancier la classe Foo sans conteneur de dépendances (c'est juste un constructeur), et 2) nous ne couplons pas notre test à nos détails d'implémentation (la réflexion nous lie au nom du champ à l'aide d'une chaîne, ce qui pourrait poser un problème si nous changeons le nom du champ).
la source
Vous pouvez utiliser cette annotation magique Spring Test:
voir org.springframework.test.context.TestPropertySource
Par exemple, voici la classe de test:
Et voici la classe avec la propriété:
la source
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/
la source
Une façon de résoudre ce problème consiste à modifier votre classe pour utiliser l' injection de constructeur , qui est utilisée pour les tests et l'injection de ressort. Plus de réflexion :)
Ainsi, vous pouvez passer n'importe quelle chaîne en utilisant le constructeur:
Et dans votre test, utilisez-le simplement:
la source