[JAVA] Partie de la classe appelée à partir de la classe testée dans le mémo de méthode JMockit Mock

Situation requise

Si vous souhaitez simuler uniquement certaines méthodes de la classe appelée à partir de la classe testée

JMockit 1.46

Conclusion

  1. Transmettez l'instance que vous souhaitez simuler aux attentes et ne définissez que la méthode que vous souhaitez simuler dans les attentes.
  2. Définissez (de force) sur la classe cible de test

Classe testée

public class Sample {

	@Inject
	Hoge hoge;

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

J'utilise la méthode de Hoge injectée à partir de la classe testée. Il s'agit d'une solution de contournement si vous souhaitez partiellement Mock the Hoge.

Classe appelée depuis la classe testée

public class Hoge {

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

	public String getHogeUpper() {
		return null;
	}
}

Veuillez supposer que getHoge a été implémenté et que getHogeUpper n'a pas encore été implémenté.

Test échoué

public class SampleTest {

	@Tested
	Sample sample;

 	@Injectable
	Hoge hoge;

	/**
	 *Un cas où vous souhaitez simuler uniquement certaines méthodes de la classe appelée à partir de la classe cible de test.
	 *Le test échoue.
	 */
	@Test
	public void test() {

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

		String actual = sample.getHoge();
		assertThat(actual, is("hogeHOGE")); //réel devient nul HOGE
	}
}

Étant donné que la classe testée utilise Inject, j'essaierais normalement d'injecter des instances avec @Tested et @Injectable dans JMockit, mais cela entraînerait l'échec du test. La raison en est que @Injectable videra toutes les méthodes Hoge.

Test réussi

public class SampleTest2 {

	Sample sample = new Sample();

	/**
	 *Un cas où vous souhaitez simuler uniquement certaines méthodes de la classe appelée à partir de la classe cible de test.
	 *Le test réussit.
	 * @throws Exception
	 * @throws NoSuchFieldException
	 */
	@Test
	public void test() throws NoSuchFieldException, Exception {

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

		//Définissez le hoge partiellement moquée dans le champ privé de Sample
        Field field = sample.getClass().getDeclaredField("hoge");
        field.setAccessible(true);
        field.set(sample, hoge);

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

Voir ci-dessous pour plus d'informations sur le Mock partiel. https://jmockit-ja.nyamikan.net/tutorial/Mocking.html#partial Le test réussit en définissant l'instance Mocked Mock partiellement sur la classe cible de test par réflexion.

finalement

Dans les anciennes versions de JMockit, seule une partie de celui-ci était MockUp et l'instance obtenue avec getMockInstance était définie dans la classe de test avec Deencapsulation.setField, mais dans la version 1.46, les deux méthodes ont disparu. .. .. Soyez prudent lors de la mise à jour de la version de JMockit, car l'API est fréquemment supprimée. S'il vous plaît laissez-moi savoir s'il existe un autre bon moyen.

Recommended Posts

Partie de la classe appelée à partir de la classe testée dans le mémo de méthode JMockit Mock
Comment se moquer de certaines méthodes de la classe testée
Obtenez le nom du scénario de test dans la classe de test JUnit
Nommer et appeler explicitement des méthodes de classe parent dans Ruby
Incrémenté du troisième argument de la méthode iterate de la classe Stream ajoutée depuis Java9
Correspondance de la partie où l'authentification # getDetails est effectuée dans le test unitaire de spring-security
[Order method] Définit l'ordre des données dans Rails
[Java] Gestion des Java Beans dans la chaîne de méthodes
Appel de méthode Java depuis RPG (appel de méthode dans sa propre classe)
Mémo de support temporaire lorsque le nom du paramètre de méthode de la classe Java ne peut pas être obtenu par réflexion dans le projet de plug-in Eclipse
Un examen rapide de Java appris en classe part4
Un examen rapide de Java appris en classe part3
Un examen rapide de Java appris en classe part2
Pourquoi la méthode get est nécessaire dans la classe Calendar
Récapitulez les éléments supplémentaires de la classe Optional dans Java 9
Comment obtenir le nom d'une classe / méthode exécutée en Java
L'histoire de la montée de Spring Boot de la série 1.5 à la série 2.1 part2
JSON en Java et Jackson Partie 1 Renvoyer JSON à partir du serveur
L'histoire du lancement de données BLOB depuis EXCEL dans DBUnit
[Memo] JSUG Study Group 2019 Partie 7 Utilisation du printemps dans Bizreach
Memo of JSUG Study Group 2018 Partie 2-Efforts pour les spécifications de travail à l'ère du printemps et de l'API-
[Java débutant] Conversion d'une chaîne de caractères en valeur numérique - Quelle est la méthode parseInt de la classe Integer? ~