[JAVA] Si vous souhaitez satisfaire la couverture de test des méthodes privées dans JUnit

Dans des moments comme ça

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)

Par exemple

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;
}

Comment répondre

Utilisez Mockito https://site.mockito.org/

Préparation

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.

Lors de l'utilisation de Maven

<!-- 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>

Si vous utilisez Gradle

dependencies {
  // https://mvnrepository.com/artifact/org.mockito/mockito-all
  testCompile group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
}

Comment utiliser

É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.

Version avancée

Si vous souhaitez obtenir ou définir une variable privée dans votre test

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.

finalement

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.

Recommended Posts

Si vous souhaitez satisfaire la couverture de test des méthodes privées dans JUnit
Tester les méthodes privées dans JUnit
Tester les méthodes privées dans JUnit
Si vous souhaitez inclure la classe parente dans @builder de Lombok
[Swift] Lorsque vous voulez savoir si le nombre de caractères dans String correspond à un certain nombre ...
Comment tester une méthode privée qui prend un tableau ou un argument de longueur variable dans JUnit
[RSpec] Lorsque vous souhaitez utiliser la variable d'instance du contrôleur dans le test [attribuer n'est pas recommandé]
Obtenez le nom du scénario de test dans la classe de test JUnit
Que faire si vous ne pouvez pas obtenir le texte d'un élément dans Selenium
Points à garder à l'esprit lors du test de méthodes privées dans JUnit
Comment se moquer de certaines méthodes de la classe testée
[Java] Tester des méthodes privées avec JUnit
ProxyFactory est pratique lorsque vous souhaitez tester AOP avec Spring!
Si vous souhaitez modifier l'environnement de développement Java d'Eclipse
Rails Les méthodes privées font mal si vous ressentez la même chose que Java!
Je veux changer la valeur de l'attribut dans Selenium of Ruby
Que faire si vous oubliez votre mot de passe root sur CentOS7
Si vous souhaitez simplement exécuter vos conteneurs dans le cloud, Azure Container Instances est facile
Si vous souhaitez simuler une méthode dans RSpec, vous devez utiliser la méthode allow pour mock et la méthode singleton.
Un mémo lorsque vous souhaitez effacer la partie horaire de l'agenda
Comment filtrer JUnit Test dans Gradle
Si vous souhaitez incorporer dynamiquement des valeurs et ajouter du texte aux valeurs d'attribut dans Thymeleaf 3
Comment tester l'étendue privée avec JUnit
Je veux que vous utilisiez Enum # name () pour la clé de SharedPreference
Vous pouvez ne pas vouloir utiliser la méthode remove sur ArrayList très souvent
Soyez prudent avec la mise à niveau si vous utilisez | etc. dans l'URL Tomcat
Si vous utilisez Android Room et que vous souhaitez modifier la définition de colonne
Si vous souhaitez modifier les colonnes de la base de données, etc.
Lorsque vous souhaitez lier InputStream dans JDBI3
JUnit 5: Comment écrire des cas de test dans enum
Je veux var_dump le contenu de l'intention
Lorsque vous souhaitez utiliser la méthode à l'extérieur
Je veux obtenir la valeur en Ruby
Que faire si vous obtenez une erreur d'argument: nombre incorrect d'arguments (donné 2, attendu 0) dans votre test RSpec
Même si je souhaite convertir le contenu d'un objet de données en JSON en Java, il existe une référence circulaire ...
Je veux que vous racontiez que l'erreur a été résolue lorsque vous avez poignardé le chargeur dans le coin de la tête
Si vous utilisez SQLite avec VSCode, utilisez l'extension (comment voir le fichier binaire de sqlite3)
[rails] Option After utile lorsque vous souhaitez modifier l'ordre des colonnes DB
Que faire si vous obtenez une erreur de nombre d'arguments erroné dans binding.pry
Pour ceux qui souhaitent utiliser MySQL pour la base de données dans la construction de l'environnement de Rails6 ~.
Si vous faites une erreur dans l'emplacement de description de Gem, supprimez Gemfile.lock une fois.
[Active Admin] Je souhaite spécifier l'étendue de la collection à afficher dans select_box
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé
[Java] Comment omettre le constructeur privé dans Lombok
Je veux intégrer n'importe quel TraceId dans le journal
Si vous souhaitez séparer le traitement Spring Boot + Thymeleaf
Si hash [: a] [: b] [: c] = 0 dans Ruby, je veux que vous étendiez récursivement même si la clé n'existe pas
Je ne peux pas saisir le japonais avec le code VS (Visual Studio Code) d'Ubuntu 18.04.5! ?? Si vous souhaitez télécharger VS Code sur Ubuntu, rendez-vous sur le site officiel! !!
Tester le contenu d'un fichier Excel avec JUnit
Comprendre les caractéristiques de Scala en 5 minutes (Introduction à Scala)
Je veux connaître la réponse de l'application Janken
Je souhaite afficher le nom de l'affiche du commentaire
Si vous souhaitez utiliser Mockito avec Kotlin, utilisez mockito-kotlin