2017-06-26 4 views
1

Einheit Ich habe die folgende Klasse zu testen.Wie Testlogik in einer inneren Klasse mit Mockito/Powermockito

public class ClassToTest { 

    private View view; 

    public ClassToTest(View view) { 
     this.view = view; 
    } 

    public void init() { 
     view.add(new ParamClass.OnSomething() { 
      @Override 
      public void onSomethingElse() { 
       view.doSomeWork(); 
      } 
     }); 
    } 
} 

Wo Ansicht

public class View { 
    public void add(OnSomething onSomething) { 
    } 

    public void doSomeWork() { 
    } 
} 

I Ansicht Objekt verspottet haben, aber keine Ahnung, wie die Logik testen markiert „Einige Logik hier zu testen“

ParamClass ist endgültig.

public final class ParamClass { 

    public interface onSomething { 
    public void onSomethingElse(); 
    } 
} 

Ohne Änderung Quelle zu machen, gibt es eine Möglichkeit, um Unit-Test dies mit Mockito/Powermockito?

Ich versuche, den Aufruf von doSomeWork()

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ ClassToTest.class }) 
public class TestClass { 

    @Mock View view; 

    @Before 
    public void init() { 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void test() throws Exception { 
     ClassToTest classToTest = new ClassToTest(view); 
     PowerMockito.doCallRealMethod().when(view).add(Mockito.any(ParamClass.OnSomething.class)); 
     PowerMockito.whenNew(ParamClass.OnSomething.class) 
       .withAnyArguments() 
       .thenReturn(new ParamClass.OnSomething() { 
        @Override 
        public void onSomethingElse() { 
         view.doSomeWork(); 
        } 
       }); 
     classToTest.init(); 
     Mockito.verify(view, Mockito.times(1)).doSomeWork(); 
    } 
} 

Sein Wurf Ausnahme

java.lang.ArrayIndexOutOfBoundsException: 0 

at org.powermock.api.mockito.internal.expectation.DefaultConstructorExpectationSetup.withAnyArguments(DefaultConstructorExpectationSetup.java:66) 
at com.linkedin.android.lite.animations.TestClass.test(TestClass.java:29) 
+0

Was ist das Problem hier? Sie übergeben die Instanz an Ihre Ansicht, damit Sie sie aufrufen können. –

Antwort

0

Nun, um zu überprüfen, was sind Sie genau zu testen versuchen? Wenn Code innerhalb von SomethingElse vorhanden ist, der andere Objekte/Methoden aufruft, können Sie alle anderen Aufrufe simulieren und dann Mockito.verify (mockObjectHere) .methodCalled() für die Methoden verwenden, die aufgerufen wurden, wenn Sie nur Tests für das Verhalten implementieren möchten .

+0

Ich habe den Code mit dem, was ich testen möchte, aktualisiert – Ankit

0

Ich habe herausgefunden, wie es geht. Aktualisierung der Antwort

Verwandte Themen