[JAVA] Ein Teil der Klasse, der von der zu testenden Klasse im JMockit Mock-Methodenmemo aufgerufen wurde

Erforderliche Situation

Wenn Sie nur einige Methoden der Klasse verspotten möchten, die von der zu testenden Klasse aufgerufen wurden

JMockit 1.46

Fazit

  1. Übergeben Sie die Instanz, die Sie verspotten möchten, an Erwartungen und definieren Sie nur die Methode, die Sie in Erwartungen verspotten möchten
  2. Stellen Sie (gewaltsam) die Testzielklasse ein

Getestete Klasse

public class Sample {

	@Inject
	Hoge hoge;

	public String getHoge() {
		return hoge.getHoge() + hoge.getHogeUpper();
	}
}

Ich verwende die Methode von Hoge, die aus der zu testenden Klasse injiziert wurde. Dies ist eine Problemumgehung, wenn Sie den Hoge teilweise verspotten möchten.

Klasse aus der zu testenden Klasse aufgerufen

public class Hoge {

	public String getHoge() {
		return "hoge";
	}

	public String getHogeUpper() {
		return null;
	}
}

Bitte nehmen Sie an, dass getHoge implementiert wurde und getHogeUpper noch nicht implementiert wurde.

Im Test durchgefallen

public class SampleTest {

	@Tested
	Sample sample;

 	@Injectable
	Hoge hoge;

	/**
	 *Ein Fall, in dem Sie nur einige Methoden der Klasse verspotten möchten, die von der Testzielklasse aufgerufen wurden.
	 *Der Test schlägt fehl.
	 */
	@Test
	public void test() {

		new Expectations(hoge) {{
			hoge.getHogeUpper();
			result = "HOGE";
		}};

		String actual = sample.getHoge();
		assertThat(actual, is("hogeHOGE")); //Ist wird null HOGE
	}
}

Da die zu testende Klasse Inject verwendet, würde ich normalerweise versuchen, Instanzen mit @Tested und @Injectable in JMockit zu injizieren, aber dies würde dazu führen, dass der Test fehlschlägt. Der Grund ist, dass @Injectable alle Hoge-Methoden leer macht.

Test erfolgreich

public class SampleTest2 {

	Sample sample = new Sample();

	/**
	 *Ein Fall, in dem Sie nur einige Methoden der Klasse verspotten möchten, die von der Testzielklasse aufgerufen wurden.
	 *Der Test ist erfolgreich.
	 * @throws Exception
	 * @throws NoSuchFieldException
	 */
	@Test
	public void test() throws NoSuchFieldException, Exception {

		Hoge hoge = new Hoge();
		new Expectations(hoge) {
			{
				hoge.getHogeUpper();
				result = "HOGE";
			}
		};

		//Stellen Sie den teilweise verspotteten Hoge in das private Feld von Sample ein
        Field field = sample.getClass().getDeclaredField("hoge");
        field.setAccessible(true);
        field.set(sample, hoge);

		String actual = sample.getHoge();
		assertThat(actual, is("hogeHOGE"));
	}
}

Weitere Informationen zum partiellen Mock finden Sie weiter unten. https://jmockit-ja.nyamikan.net/tutorial/Mocking.html#partial Der Test ist erfolgreich, indem die teilweise verspottete Mock-Instanz durch Reflexion auf die Testzielklasse gesetzt wird.

Schließlich

In älteren Versionen von JMockit wurde nur ein Teil davon mit MockUp verspottet, und die mit getMockInstance erhaltene Instanz wurde in der Testklasse mit Deencapsulation.setField festgelegt, aber in 1.46 verschwanden beide Methoden. .. .. Bitte seien Sie vorsichtig, wenn Sie die Version von JMockit aktualisieren, da die API häufig gelöscht wird. Bitte lassen Sie mich wissen, ob es einen anderen guten Weg gibt.

Recommended Posts

Ein Teil der Klasse, der von der zu testenden Klasse im JMockit Mock-Methodenmemo aufgerufen wurde
Wie man einige Methoden der zu testenden Klasse verspottet
Rufen Sie den Namen des Testfalls in der JUnit-Testklasse ab
Benennen und rufen Sie in Ruby übergeordnete Klassenmethoden explizit auf
Inkrementiert durch das dritte Argument der iterierten Methode der aus Java9 hinzugefügten Stream-Klasse
Korrespondenz des Teils, in dem die Authentifizierung # getDetails im Komponententest der Federsicherheit durchgeführt wird
[Bestellmethode] Legen Sie die Reihenfolge der Daten in Rails fest
[Java] Behandlung von Java Beans in der Methodenkette
Java-Methodenaufruf von RPG (Methodenaufruf in eigener Klasse)
Temporäres Support-Memo, wenn der Name des Methodenparameters der Java-Klasse nicht durch Reflektion im Eclipse-Plug-In-Projekt abgerufen werden kann
Ein kurzer Überblick über Java, das in Klasse 4 gelernt wurde
Ein kurzer Überblick über Java, das in Klasse 3 gelernt wurde
Ein kurzer Überblick über Java, das in Klasse 2 gelernt wurde
Warum die get-Methode in der Calendar-Klasse benötigt wird
Fassen Sie die zusätzlichen Elemente der optionalen Klasse in Java 9 zusammen
So erhalten Sie den Namen einer Klasse / Methode, die in Java ausgeführt wird
Die Geschichte der Erhöhung von Spring Boot von 1.5 auf 2.1 Serie Teil2
JSON in Java und Jackson Teil 1 Gibt JSON vom Server zurück
Die Geschichte des Werfens von BLOB-Daten von EXCEL in DBUnit
[Memo] JSUG Study Group 2019 Teil 7 Nutzung des Frühlings in Bizreach
Memo der JSUG-Studiengruppe 2018 Teil 2 - Bemühungen um Arbeitsspezifikationen im Frühjahr und in der API-Ära
[Java-Anfänger] Konvertierung von Zeichenfolge in numerischen Wert - Was ist die parseInt-Methode der Integer-Klasse? ~