[JAVA] Si vous souhaitez utiliser Mockito avec Kotlin, utilisez mockito-kotlin

Veuillez noter que cet article ne décrit pas comment utiliser Mockito lui-même. Contient de nombreuses descriptions pour Android.

Problèmes qui surviennent lorsqu'il est utilisé tel quel

Si vous utilisez Mockito tel qu'il est dans Kotlin, vous obtiendrez le code suivant.

val sharedPreferences = mock(SharedPreferences::class.java)
val editor = mock(SharedPreferences.Editor::class.java, RETURNS_DEEP_STUBS)

`when`(sharedPreferences.edit()).thenReturn(editor)
`when`(editor.commit()).thenReturn(true)
`when`(editor.putString(anyString(), anyString())).thenReturn(editor)

Le code ci-dessus est le code qui se moque des SharedPreferences d'Android. sharedPreferences.edit () renvoie un éditeur plus moqueur, vous permettant d'utiliser commit () et putString ().

La méthode mock () qui crée l'objet fictif est correcte, mais la partie de la méthode when () qui détermine le comportement de l'objet fictif est entourée de guillemets, ce qui est très difficile à voir.

Cela se produit parce que le mot «quand» est réservé dans Kotlin et doit être échappé par des guillemets.

Bien sûr, il n'y a pas de problème en l'état, mais cette fois, c'est une bibliothèque qui fait que le code fait partie de ce simulacre plus comme Kotlin, [** mockito-kotlin **](https://github.com/nhaarman/mockito- Je voudrais utiliser kotlin).

environnement

Ajouter une dépendance

Ajoutez des références de bibliothèque de chaque manière, comme Gradle ou Maven.

//testLa mise en œuvre est adaptée à l'environnement
testImplementation "com.nhaarman:mockito-kotlin:1.5.0"

Comment utiliser

Créer un objet simulé

Au lieu de passer la classe en argument, elle sera spécifiée par des génériques.

val sharedPreferences = mock<SharedPreferences> {}

Les options passées dans le deuxième argument et les suivants continueront à être décrites dans les arguments de la méthode.

val editor = mock<SharedPreferences.Editor>(defaultAnswer = RETURNS_DEEP_STUBS) { }

Tout le contenu de withSettings () peut également être passé comme arguments.

//Les arguments qui peuvent être utilisés sont les suivants(1.5.0 présent)
extraInterfaces: Array<KClass<out Any>>? = null
name: String? = null
spiedInstance: Any? = null
defaultAnswer: Answer<Any>? = null
serializable: Boolean = false
serializableMode: SerializableMode? = null
verboseLogging: Boolean = false
invocationListeners: Array<InvocationListener>? = null
stubOnly: Boolean = false
useConstructor: Boolean = false
outerInstance: Any? = null
stubbing: KStubbing<T>.(T) -> Unit

Spécification du comportement de l'objet fictif

N'utilisez pas when, mais décrivez-le dans l'argument de fonction {} lors de la création d'une maquette. ʻOn {Mocking method ()} Spécifiez la méthode pour simuler l'opération avec, suivie de doReturn, doAnswer, doThrow`. Le code ci-dessous est équivalent au code Mockito introduit au début de l'article.

val editor = mock<SharedPreferences.Editor>(defaultAnswer = RETURNS_DEEP_STUBS) {
    on { commit() } doReturn true
    on { putString(anyString(), anyString()) } doReturn it
}
val sharedPreferences = mock<SharedPreferences> {
    on { edit() } doReturn editor
}

//Ci-dessous le code au début de l'article
val sharedPreferences = mock(SharedPreferences::class.java)
val editor = mock(SharedPreferences.Editor::class.java, RETURNS_DEEP_STUBS)

`when`(sharedPreferences.edit()).thenReturn(editor)
`when`(editor.commit()).thenReturn(true)
`when`(editor.putString(anyString(), anyString())).thenReturn(editor)

doReturn

La valeur écrite en continu sera la valeur de retour de la méthode à simuler. Si la valeur de retour est void ou ʻUnit, il est possible de retourner ʻUnit.

val stringMock = mock<String> {
    on { toString() } doReturn "mocked"
}
stringMock.toString() // => "mocked"

doAnswer

Ecrivez une fonction qui prend un objet simulé comme récepteur et renvoie le type que la méthode est censée renvoyer. C'est comme «let».

val stringMock = mock<String> {
    on { toString() } doAnswer { "mocked" + it.hashCode() }
}
stringMock.toString() // => "mocked[Nombres]"

doThrow

Jetez l'exception que vous avez écrite successivement.

val stringMock = mock<String> {
    on { toString() } doThrow RuntimeException()
}
stringMock.toString() // => RuntimeException

en conclusion

Vous pouvez utiliser ʻany () ʻet ʻargThat () `dans la partie de la spécification de l'argument de la méthode à moquer, donc je pense que les bases ne seront pas un problème. Pour les autres méthodes d'écriture, il est facile à comprendre en regardant le Wiki Github et le code de test, donc si vous ne savez pas comment l'écrire, vous devriez le regarder.

Wiki: https://github.com/nhaarman/mockito-kotlin/wiki/Mocking-and-verifying Code de test: https://github.com/nhaarman/mockito-kotlin/tree/2.x/tests/src/test/kotlin/test

Recommended Posts

Si vous souhaitez utiliser Mockito avec Kotlin, utilisez mockito-kotlin
Si vous osez comparer Integer avec "==" ...
Si vous souhaitez utiliser Oracle JDK 11 à partir de septembre (ajoutez Amazon Corretto)
Si vous voulez créer un fichier zip avec Ruby, c'est rubyzip.
Si vous souhaitez modifier les colonnes de la base de données, etc.
Vous utilisez le contexte pour utiliser MDC avec Spring WebFlux
Je veux utiliser java8 forEach avec index
Lorsque vous souhaitez utiliser la méthode à l'extérieur
Je souhaite utiliser les fonctions pratiques de Clojure dans Kotlin
Si vous souhaitez séparer le traitement Spring Boot + Thymeleaf
Je veux faire des transitions d'écran avec kotlin et java!
Si vous utilisez SQLite avec VSCode, utilisez l'extension (comment voir le fichier binaire de sqlite3)
Code à utiliser lorsque vous souhaitez traiter Json en Java avec uniquement des bibliothèques standard
Comment utiliser le modèle entraîné Tensorflow 2.0 avec Kotlin / Java
Si vous souhaitez étudier la programmation à l'université, allez en Australie
[# 3 Java] Lisez ceci si vous voulez étudier Java! ~ Sélectionné avec soin ~
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
Lorsque vous souhaitez écrire explicitement OR ou AND avec ransack
Je veux implémenter diverses fonctions avec kotlin et java!
docker-compose.yml lorsque vous voulez garder mysql en cours d'exécution avec docker
lombok.config lorsque vous voulez passer @Qualifier à @RequiredArgsConstructor avec lombok
Delicate est pratique à utiliser lorsque vous souhaitez réutiliser des pièces
Que faire si la commande rails devient inutilisable
Vous devez utiliser winpty avec docker exec [Windows]
Je veux revenir à l'écran précédent avec kotlin et java!
Si vous souhaitez inclure la classe parente dans @builder de Lombok
Si vous souhaitez modifier l'environnement de développement Java d'Eclipse
Que faire si vous vous fâchez contre OpenSSL avec Pyenv Install
Si vous souhaitez simuler une méthode dans RSpec, vous devez utiliser la méthode allow pour mock et la méthode singleton.
Pratique à utiliser lorsque vous souhaitez exécuter différents groupes de traitement en série
[Rails] Que faire si vous ne pouvez pas obtenir de paramètres avec form_with
Résumé des moyens lorsque vous souhaitez communiquer avec HTTP sur Android
Si vous souhaitez incorporer dynamiquement des valeurs et ajouter du texte aux valeurs d'attribut dans Thymeleaf 3
Je veux que vous utilisiez Enum # name () pour la clé de SharedPreference
Comment utiliser BootStrap avec Play Framework
Commandes de base de Rails que vous souhaitez apprendre
Je veux utiliser @Autowired dans Servlet
Que faire si vous avez activé Utiliser le moteur basé sur WSL2 dans Docker Desktop avec une installation WSL2 insuffisante
Comment faire fonctionner @Transactional qui ne fonctionne pas si vous ne l'utilisez pas correctement
Vous pouvez ne pas vouloir utiliser la méthode remove sur ArrayList très souvent
Si vous utilisez Android Room et que vous souhaitez modifier la définition de colonne
Je veux que vous utilisiez Scala comme meilleur Java pour le moment
[Eclipse] Je veux utiliser la fonction de complétion, mais je veux réussir à confirmer la complétion avec un espace
[Spring Boot] Si vous utilisez Spring Boot, il était pratique d'utiliser de nombreux utilitaires.
Si vous lancez null à Servlet avec ajax, il sera converti en blanc ""
Comment se moquer de chaque cas avec Mockito 1x
Comment utiliser h2db intégré avec Spring Boot
Avec Tomcat, vous pouvez utiliser des espaces réservés ($ {...}) dans web.xml.
Lorsque vous souhaitez lier InputStream dans JDBI3
Que faire si vous transmettez des informations incorrectes
[Swift] Utilisez nonzeroBitCount lorsque vous voulez popcnt dans Swift
Premiers pas avec Kotlin à envoyer aux développeurs Java
Un moyen très simple d'utiliser enum avec JSP