Ich benutze Spring 3.1.4.RELEASE und Mockito 1.9.5. In meiner Frühlingsklasse habe ich:
@Value("#{myProps['default.url']}")
private String defaultUrl;
@Value("#{myProps['default.password']}")
private String defaultrPassword;
// ...
Aus meinem JUnit-Test, den ich derzeit so eingerichtet habe:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
public class MyTest
{
Ich möchte einen Wert für mein Feld "defaultUrl" verspotten. Beachten Sie, dass ich keine Werte für die anderen Felder verspotten möchte - ich möchte diese so lassen, wie sie sind, nur das Feld "defaultUrl". Beachten Sie auch, dass ich setDefaultUrl
in meiner Klasse keine expliziten "Setter" -Methoden (z. B. ) habe und keine nur zu Testzwecken erstellen möchte.
Wie kann ich vor diesem Hintergrund einen Wert für dieses eine Feld verspotten?
ReflectionTestUtils.setField(bean, "fieldName", "value");
Option, bevor Sie Ihrebean
Methode während des Tests aufrufen .Es war jetzt das dritte Mal, dass ich mich in diesen SO-Beitrag gegoogelt habe, da ich immer vergesse, wie man ein @ Value-Feld verspottet. Obwohl die akzeptierte Antwort korrekt ist, brauche ich immer etwas Zeit, um den "setField" -Aufruf richtig zu machen. Zumindest für mich selbst füge ich hier ein Beispiel-Snippet ein:
Produktionsklasse:
Testklasse:
quelle
Sie können Ihre Eigenschaftskonfiguration auch in Ihrer Testklasse verspotten
quelle
Ich möchte eine verwandte Lösung vorschlagen, bei der die mit
@Value
-annotierten Felder als Parameter an den Konstruktor übergeben werden, anstatt dieReflectionTestUtils
Klasse zu verwenden.An Stelle von:
und
Mach das:
und
Vorteile dieses Ansatzes: 1) Wir können die Foo-Klasse ohne einen Abhängigkeitscontainer instanziieren (es ist nur ein Konstruktor), und 2) wir koppeln unseren Test nicht mit unseren Implementierungsdetails (Reflexion bindet uns mit einer Zeichenfolge an den Feldnamen). Dies könnte ein Problem verursachen, wenn wir den Feldnamen ändern.
quelle
Sie können diese magische Anmerkung zum Frühlingstest verwenden:
Siehe org.springframework.test.context.TestPropertySource
Dies ist beispielsweise die Testklasse:
Und das ist die Klasse mit der Eigenschaft:
quelle
Ich habe den folgenden Code verwendet und es hat bei mir funktioniert:
Referenz: https://www.jeejava.com/mock-an-autowired-value-field-in-spring-with-junit-mockito/
quelle
Eine Möglichkeit, dies zu beheben, besteht darin, Ihre Klasse so zu ändern , dass die Konstruktorinjektion verwendet wird, die zum Testen und zur Federinjektion verwendet wird. Keine Reflexion mehr :)
Sie können also einen beliebigen String mit dem Konstruktor übergeben:
Und in Ihrem Test verwenden Sie es einfach:
quelle