Comment se moquer de la méthode e dans le Journal de
Ici Utils.java est ma classe à être testé et qui suit est la méthode qui est appelée dans UtilsTest classe.
Même si je suis moqueur Journal.e méthode comme indiqué ci-dessous
@Before
public void setUp() {
when(Log.e(any(String.class),any(String.class))).thenReturn(any(Integer.class));
utils = spy(new Utils());
}
Je suis l'exception suivante
java.lang.RuntimeException: Method e in android.util.Log not mocked. See http://g.co/androidstudio/not-mocked for details.
at android.util.Log.e(Log.java)
at com.xxx.demo.utils.UtilsTest.setUp(UtilsTest.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Vous devez vous connecter pour publier un commentaire.
Cela a fonctionné pour moi. Je suis seulement en utilisant JUnit et j'ai été capable de se moquer de la
Log
classe sans tiers lib très facile. Il suffit de créer un fichierLog.java
à l'intérieur deapp/src/test/java/android/util
avec le contenu:Log
classe parce que c'est trop omniprésent et le passage d'un Journal wrapper partout rend le code moins lisible. Dans la plupart des cas, l'injection de dépendance doit être utilisé à la place.@file:JvmName("Log")
et des fonctions de niveau supérieur.Vous pouvez mettre ceci dans votre gradle script:
Qui va décider si unmocked méthodes de android.jar devrait lancer des exceptions ou le retour des valeurs par défaut.
À l'aide de PowerMockito:
Et vous êtes bon pour aller. Soyez avisé que PowerMockito ne sera pas automatiquement de se moquer hérité des méthodes statiques, donc si vous voulez vous moquer de journalisation personnalisé classe qui étend la classe Journal, vous devez toujours se moquer de Journal pour les appels comme MyCustomLog.e().
Utilisation PowerMockito.
Si l'aide de Kotlin je vous conseille d'utiliser une bibliothèque moderne comme mockk qui a construit-dans le traitement de la statique et de beaucoup d'autres choses. Ensuite, il peut être fait avec cette:
Mockito ne pas se moquer des méthodes statiques. Utilisation PowerMockito sur le dessus. Ici en est un exemple.
thenReturn(...)
déclaration. Vous devez spécifier une valeur tangible. Voir plus d'informations hereÀ l'aide de
PowerMock
on peut se moquer de Journal.i/e/w méthodes statiques à partir d'Android enregistreur. Bien sûr, idéalement, vous devez créer un enregistrement à l'interface ou une façade et de fournir une manière de se connecter à différentes sources.C'est une solution complète de Kotlin:
n'oubliez pas d'ajouter des dépendances dans gradle:
Pour se moquer de
Log.println
l'utilisation d'une méthode:Je vous conseille d'utiliser bois pour votre enregistrement.
Si elle ne log rien lors de l'exécution des tests, mais il ne s'agit pas de vos tests inutilement la façon dont android Journal de classe. Bois vous donne beaucoup de contrôle pratique de plus de debug et de la production de la construction de votre application.
Une autre solution est d'utiliser Robolectric. Si vous voulez l'essayer, vérifier son installation.
Dans votre module de construire.gradle, ajoutez les éléments suivants
Et dans votre classe de test,
Si vous êtes à l'aide de l'org.slf4j.Enregistreur, puis il suffit de se moquant de l'Enregistreur de données dans la classe de test à l'aide de PowerMockito a fonctionné pour moi.