[JAVA] Argument Mockito null Le test d'hypothèse a spécifié le type et n'a pas retourné

En travaillant chez JUnit, lorsque j'utilisais un framework appelé Mockito comme une sorte d'objet simulé, il n'a pas renvoyé Output comme je m'y attendais et il a fondu pendant une demi-journée, alors j'ai pris une note.

↓ Site d'introduction Mockito. Comment boire Mockito

supposition

Par exemple, si vous souhaitez tester un modèle dans lequel null est inclus dans l'argument de la méthode getContent de la classe Controller </ b> dans la source suivante. (Le code est cité et modifié à partir du site ci-dessus.)

getContent est une méthode qui utilise getContentById de la classe Service à l'intérieur, mais lorsque vous voulez tester uniquement la logique directement sous getContent, vous ne voulez pas vous soucier de la logique à l'intérieur de getContentById. Par conséquent, utilisez Mockito pour spécifier des E / S qui ne dépendent pas de la logique dans getContentById, et effectuez un test indépendant pour chaque classe.

Controller.java


  public class Controller
  {
      private Service service = new Service();

      public String getContent(String id) {
          String content = service.getContentById(id);
          return content;
      }
  }

Service.java


  public class Service
  { 
     private Map contents = new HashMap();
  
     //constructeur
     public Service(){ genContents(); }

     //Spécifiez la clé et la valeur de retour
     public String getContentById(String id) {
          String content;
          content = contents.get(id);
          return content;
     }

     //Créer du contenu
     public void genContents() {
          contents.put("1","Tanaka");
          contents.put("2","Saitou");
          contents.put("3","Yoshida");
          contents.put("4","Suzuki");
     }
   }

Le mauvais code suivant

  public class Test{
     Controller controller = new Controller();

     //Faire un service factice, je ne connais pas le contenu
     Service service = mock(Service.class);
     // I/Seul O est défini séparément
     doReturn("Content1").when(service).getContentById(Mockito.anyString());
}

Instructions commençant par doReturn

"Renvoie la chaîne Content1 chaque fois qu'elle est appelée avec n'importe quel type Int comme argument."

Cependant, dans cette hypothèse, puisque l'argument de getContentId est nul, anyString () n'est pas spécifié et getContent ne renvoie rien. Par conséquent, nous allons spécifier un argument plus large.

Corriger le code ci-dessous

     doReturn("Content1").when(service).getContentById(Mockito.any());

Maintenant dans la méthode getContentById

"Renvoie la chaîne Content1 lorsqu'elle est appelée car tout va bien"

Vous pouvez ajouter le paramètre. J'ai pu le déplacer même si l'argument était nul.

Dans l'entreprise réelle, j'ai utilisé ʻArgumentMatchers.any (~~~ .class) au lieu de Mockito.Any ~ () `pour simuler la méthode avec mon propre argument de type, mais cette fois J'ai essayé de l'écrire avec un modèle de type String plus facilement.

Postscript

Recommended Posts

Argument Mockito null Le test d'hypothèse a spécifié le type et n'a pas retourné
Conversion de type facultative et valeur de retour (prise en charge nulle)
null spécifie le type
java.util.Optional class et null et non null