2017-02-22 1 views
2

Ich versuche, mit if(), thenReturn() auf eine if-Bedingung zu testen, aber wenn ich meinen Testfall ausführe, fehlt mir der Methodenaufruf, obwohl ich habe die Klasse verspottet, in der die Methode implementiert ist.Mockito-Ausnahme: Fehlender Methodenaufruf beim Versuch, eine if-Bedingung zu testen

dies ist das, wenn die Bedingung Ich versuche

 if(request.getProcessType() == IPRequest.IPREQUEST_TYPE_TOMO_RECON)//IPREQUEST_TYPE_TOMO_RECON=9, this is the condition I am trying to test  
     { 
     params.setTubeAngle(accessor); //I am verifying if these methods are invoked 
     params.setTomoFocalSpot(accessor); 
     } 

Dies ist, wie ich bin Überprüfung für die if-Bedingung

when(request.getProcessType()).thenReturn(IPRequest.IPREQUEST_TYPE_TOMO_RECON); 
     Mockito.verify(ipImgParam,Mockito.times(3)).setTubeAngle(Mockito.any(AttributeExtractor.class)); 

Ich habe bereits verspottet „Anfrage“ mit @Mock Anmerkung zu verspotten, aber bekomme immer noch die folgende Ausnahme.

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'. 
For example: 
    when(mock.getArticles()).thenReturn(articles); 

Also, this error might show up because: 
1. you stub either of: final/private/equals()/hashCode() methods. 
    Those methods *cannot* be stubbed/verified. 
2. inside when() you don't call method on mock but on some other object. 
3. the parent of the mocked class is not public. 
    It is a limitation of the mock engine. 

    at common.systemreprocessingservice.test.ImageParamsBuilderTest.testbuildProcessingInfoIf(ImageParamsBuilderTest.java:134) 

Ich bin mir nicht sicher, was ich falsch mache. Kann jemand helfen?

Antwort

2

Ich kann keinen Kommentar schreiben, deshalb fragen Sie hier. Welche Art von Objekt ist "Anfrage"? Wenn es sich um ein Objekt einer finalen Klasse handelt, benötigen Sie PowerMockito, um sich darüber lustig zu machen.

Haben Sie nach der Verwendung der @Mock-Annotation auch die Methode MockitoAnnotations.initMocks(testClass.class) aufgerufen, bevor Sie den Testfall ausgeführt haben?

Der folgende Link zeigt verschiedene Möglichkeiten, wie Sie Ihre Objekte verspotten können. https://blog.frankel.ch/initializing-your-mockito-mocks/#gsc.tab=0

+0

„Anfrage“ ist ein Objekt einer öffentlichen Klasse, die ich verspottet haben @Mock verwenden. Wenn ich MockitoAnnotations.initMocks() aufruft, bekomme ich Nullzeiger-Ausnahmen, also habe ich das ignoriert. – hushie

+0

Ich denke, es gibt ein Problem, dass Ihre Mocks nicht in die Klasse injiziert werden. Hast du versucht, es ohne Anmerkungen zu verspotten? Mit 'Request request = mock (Request.class)'. PS - Wenn nicht annotierte Mocking auch nicht funktioniert, sollten Sie versuchen, diese NullPointerException zuerst aufzulösen. – blu3

+0

ja Ich habe versucht, es auch ohne die Annotation zu verspotten, aber es hat nicht funktioniert, stattdessen habe ich eine Ausnahme wie 'wollte, aber nicht aufgerufen: iPImgParams.setTubeAngle (); -> bei common.systemreprocessingservice.test.ImageParamsBuilderTest.testbuildProcessingInfoIf (ImageParamsBuilderTest.java:137) Es gab jedoch andere Interaktionen mit dieser Mock: -> bei common.systemreprocessingservice.ImageParamsBuilder.buildProcessingInfo (ImageParamsBuilder.java:34) ' – hushie

1
imageParamsBuilder.buildProcessingInfo(request, info); 
    Mockito.verify(ipImgParam, Mockito.times(3)).fillYourSelf(Mockito.any(AttributeExtractor.class)); 
    when(request.getProcessType()).thenReturn(IPRequest.IPREQUEST_TYPE_TOMO_RECON); 
    Mockito.verify(ipImgParam,Mockito.times(3)).setTubeAngle(Mockito.any(AttributeExtractor.class)); 

Die hier dritte Zeile "zu spät" ist. Sie müssen den Schein vor konfigurieren, den Sie den CuT nennen.


Es tut immer noch mein Problem

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'. 

in Test lösen:

when(TagAccessorFactory.getInstance()).thenReturn(tagAccessorFactoryMock); 

Sie können nicht statische Methoden auf diese Weise verspotten Sie PowerMockito verwenden s when() Methode.

Aber (wieder einmal) halte ich die Verwendung von PowerMockito als eine Kapitulation zu schlechten Design. Sie sollten keinen statischen Zugriff verwenden, um Abhängigkeiten zu erhalten, sondern sie mithilfe von DI in Ihre Klasse eingeben (entweder manuell oder vorzugsweise mithilfe eines DI-Frameworks).


, wenn ich rufe die

when(request.getProcessType()).thenReturn(IPRequest.IPREQUES‌​‌​T_TYPE_TOMO_RECON)‌​; 

vor dem Methodenaufruf Ich erhalte Ausnahme wie diese

Wanted but not invoked:" 

Sie versuchen, mit dem gleichen Test beiden Ausführungspfade zu testen Methode.

Sie sollten separate Testmethoden haben

+0

Es löst immer noch nicht mein Problem – hushie

+0

TagAccessorFactory ist eine Singleton-Klasse daher muss ich PowerMockitos verwenden – hushie

+0

@hushie * "TagAccessorFactory ist eine Singleton-Klasse" * ist das Ihr Code (oder Ihre Unternehmen mindestens)? –

Verwandte Themen