Je veux vraiment que JUnit ait une couverture à 100%, y compris les méthodes privées! (Fondamentalement, il est plus naturel de passer tout le test de la méthode publique)
Supposons qu'il existe une méthode privée dans la classe suivante qui ne peut pas passer le test naturellement à un seul endroit. (C'est mignon que le contenu soit spongieux)
private String getStatus(String param, TestEntity testEntity) {
String result = null;
switch (param) {
case "1":
result = "A" + testEntity.getCode();
break;
case "2":
result = "B" + testEntity.getCode();
break;
case "3":
result = "C" + testEntity.getCode();
break;
default :
result = "Z" + testEntity.getCode (); // ← La couverture ici ne passe pas!
}
return result;
}
Utilisez Mockito https://site.mockito.org/
Dans mon cas, Spring Boot et JUnit ont déjà été installés, donc Ajoutez ce qui suit à la dépendance pour obtenir la bibliothèque Mockito.
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
dependencies {
// https://mvnrepository.com/artifact/org.mockito/mockito-all
testCompile group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
}
Écrivez simplement ce qui suit dans la classe de test
private SampleUtil sampleUtil;
private static int testId = 1; // Variables utilisées dans une vérification ultérieure
@Test
public void getStatus() {
// Défini pour pouvoir exécuter SampleUtil # getStatus
Method method = SampleUtil.class.getDeclaredMethod("getStatus", String.class, TestEntity.class);
method.setAccessible(true);
// Paramètres des paramètres pour les tests
String param = "4";
TestEntity testEntity = new TestEntity();
testEntity.setCode("001");
// Essai
String status = (String) method.invoke(sampleUtil, param, testEntity);
assertThat(status, is("Z001"));
}
En définissant accessible = true pour la méthode getStatus () de SampleUtil, il est possible de l'appeler en ignorant le niveau d'accès.
Le testId suivant est une variable définie de manière privée dans SampleUtil.java. Allons-y ici.
@Test
public void getParams() {
SampleUtil sampleUtil = new SampleUtil();
assertThat(Whitebox.getInternalState(sampleUtil, "testId"), is(1));
}
En implémentant de cette manière, il est possible d'appeler en ignorant le niveau d'accès.
En plus des fonctions présentées ici, il a de nombreuses fonctions telles que la réécriture de méthodes statiques et l'élargissement de la gamme de tests JUnit. Si vous êtes intéressé, vous voudrez peut-être creuser et vérifier.