2017-12-29 7 views
1

Ich habe eine Klasse im Test, die eine Methode enthält, die eine innere anonyme Klasse hat. Eine der Methoden in der anonymen Klasse ruft eine Methode aus der getesteten Klasse auf, aber Mockito scheint dies nicht zu erkennen.Mockito: Überprüfen Methodenaufruf von internen anonymen Klasse

public class ClassUnderTest { 
    Dependency dependency; 
    public ClassUnderTest(Dependency d) { 
     dependency = d; 
    } 
    public void method() { 
     dependency.returnsObservable().observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.io()).subscribe(new Observer<SupportClass> { 

      /* Other methods omitted */ 
      public void onComplete() { 
       outerMethod(); 
      }) 
    } 

    public void outerMethod() { 
     blah; 
    } 
} 

Mein Testcode:

public class TestClass { 

    ClassUnderTest underTest; 
    Dependency dependency; 

    @Before 
    public void setUp() throws Exception { 

     dependency = Mockito.mock(Dependency.class); 
     underTest = Mockito.spy(new ClassUnderTest(dependency)); 

    } 

    @Test 
    public void method() throws 
     Mockito.when(dependency.returnObservable()).thenReturn(Observable.just(new SupportClass()); 

     Mockito.doNothing().when(underTest).outerMethod(); 

     underTest.method(); 
     Mockito.verify(underTest).outerMethod(); 

    } 

} 

Aus irgendeinem Grund, dass ich nicht scheinen, um herauszufinden können, erkennen Mockito nicht, dass outerMethod() aufgerufen wird, auch wenn ich manuell überprüft haben, indem Sie Zeile für Zeile im Debugger durchlaufen. Ich habe auch überprüft, dass der Aufruf des Abhängigkeitsobjekts das richtige Observable mit dem richtigen Inhalt zurückgibt, und die Methoden onComplete() und outerMethod() werden aufgerufen. Ich bin nur verwirrt, warum Mockito es nicht als solches erkennt.

Dies ist der Fehler, dass es ausspuckt:

Wanted but not invoked: 
classUnderTest.outerMethod(); 
-> at (file and line number) 

However, there was exactly 1 interaction with this mock: 
classUnderTest.method(); 
-> at (file and line number) 

Gibt es etwas offensichtlich fehle ich?

+0

Zeigen Sie die 'Dependency' Klasse. Ich sehe nicht, wo 'innerMethod' aufgerufen wird. Am besten wäre es, einen [MCVE] (https://stackoverflow.com/help/mcve) zu posten –

+0

Ich habe den Beispielcode aktualisiert, um hoffentlich einige Dinge zu klären. Die returnObservable() -Methode in der Abhängigkeitsklasse funktioniert korrekt/gibt ein gültiges Observable-Objekt zurück, und die Methoden onComplete() und outerMethod() werden aufgerufen. Ich bin einfach verwirrt, warum Mockito sie nicht erkennt. @VinceEmigh – theasianpianist

+1

Ihr Code ist nicht ausreichend. In Ihrer Testabhängigkeit ist ein Mock, aber Sie rufen 'dependency.returnsObservable(). Subscribe (...)'. Das würde NPE in Ihrem Test verursachen, da dependency.returnsObservable() null zurückgibt. Machen Sie Ihr Beispiel zur Arbeit. – tkruse

Antwort

2

Du wechselst zwischen Disponenten, so dass es einige Probleme verursachen kann, wenn die Prüfung (Code kann die verify Methode vor erreichen die eigentliche Methode

prüfen this article aufgerufen wird, zu erklären, wie asynchronen Code zu testen, mit RxJava und Mockito

TL; DR

hinzufügen TestRule, die alle Disponenten zu trampoline so eingestellt es verhält sich synchron :

public class TrampolineSchedulerRule implements TestRule { 
    @Override 
    public Statement apply(final Statement base, Description d) { 
    return new Statement() { 
     @Override 
     public void evaluate() throws Throwable { 
     RxJavaPlugins.setIoSchedulerHandler(
      scheduler -> Schedulers.trampoline()); 
     RxJavaPlugins.setComputationSchedulerHandler(
      scheduler -> Schedulers.trampoline()); 
     RxJavaPlugins.setNewThreadSchedulerHandler(
      scheduler -> Schedulers.trampoline()); 
     RxAndroidPlugins.setInitMainThreadSchedulerHandler(
      scheduler -> Schedulers.trampoline()); 

     try { 
      base.evaluate(); 
     } finally { 
      RxJavaPlugins.reset(); 
      RxAndroidPlugins.reset(); 
     } 
     } 
    }; 
    } 
} 
Verwandte Themen