2017-06-26 4 views
1

私は以下のクラスをテストします。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(); 
      } 
     }); 
    } 
} 

ビューは、私はビューオブジェクトを嘲笑している

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

    public void doSomeWork() { 
    } 
} 

ですが、ロジックをテストするためにどのように何の手がかりが

ParamClassは最終的なもので、「ここにいくつかのロジックをテストする」と記されていません。

public final class ParamClass { 

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

ソースを変更せずに、Mockito/Powermockitoを使用してユニットテストする方法はありますか?

は、私はあなたが正確にテストしようとしているものを()

@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(); 
    } 
} 

その投げ例外まあ

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

ここで問題がありますか?インスタンスをビューモックに渡すので、インスタンスを呼び出すことができます。 –

答えて

0

doSomeWorkの呼び出しを検証しようとしていますか?他のオブジェクト/メソッドを呼び出すonSomethingElse内のコードがある場合は、他のすべての呼び出しを単純にモックし、ビヘイビアのテストを実装したい場合は、呼び出されたメソッドに対してMockito.verify(mockObjectHere).methodCalled()を使用します。 。

+0

私はテストしようとしているコードを更新しました – Ankit

0

私はそれを行う方法を理解しました。答えを更新する。

public class TestClass { 

    @Mock View view; 

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

    @Test 
    public void test() throws Exception { 
     ClassToTest classToTest = new ClassToTest(view); 
     classToTest.init(); 
     ArgumentCaptor<ParamClass.OnSomething> captor = 
     ArgumentCaptor.forClass(ParamClass.OnSomething.class); 
     verify(view).add(captor.capture()); 
     ParamClass.OnSomething onSomething = captor.getValue(); 
     onSomething.onSomethingElse(); 
     Mockito.verify(view, Mockito.times(1)).doSomeWork(); 
    } 
} 
関連する問題