38771


Androidで次のようなプログラムを作成しテストしようとしています。

テスト対象のクラス

[code]

    public class Sample {
        public void errorCheck(TextView textView) {
            if (textView.getText().toString().equals("")) {
                textView.setError("入力してください");
            }
        }
    }
    
[/code]

テストクラス

[code]

    public class SampleTest {
        @Rule
        public MockitoRule mockito = MockitoJUnit.rule();
    
        @Mock
        private TextView mockTextView;
    
        @Test
        public void test() {
            when(mockTextView.getText()).thenReturn("");
            assertThat(mockTextView.getError().toString(), is("入力してください"));
        }
    }
    
[/code]

テストを実行すると（当然ですが）mockTextView.getError()がnullのため、NullPointerExceptionが発生します。

テストクラスでsetErrorされたことを確認したいため、次のようなモックは避けたいと考えています。

[code]

    when(mockTextView.getError()).thenReturn("入力してください");
    
[/code]

SampleクラスのsetErrorメソッドで「入力してください」と入力されたことをテストする方法はあるでしょうか？  
今回は実機やエミュレーター上でのテストは重いので、できればそういったものを使わないようにテストしたいと思っています。


CC BY-SA 3.0
2017-10-07T21:13:08.180
38519
2017-10-16T22:21:22.993
2017-10-09T11:24:24.283
2214
2214
question
android junit mock
Mockitoを使ったTextViewのテストについて


自己解決しました。

[code]

    public class SampleTest {
        @Rule
        public MockitoRule mockito = MockitoJUnit.rule();
    
        @Mock
        private TextView mockTextView;
    
        @Test
        public void test() {
            when(mockTextView.getText()).thenReturn("");
            ArgumentCaptor<String> stringCaptor = 
                ArgumentCaptor.forClass(String.class);
            doNothing().when(mockTextView).setError(stringCaptor.capture());
    
            Sample sample = new Sample();
            sample.errorCheck(mockTextView);
    
            assertThat(stringCaptor.getValue(), is("入力してください"));
        }
    }
    
[/code]

ArgumentCaptorをセットして、呼び出し先でセットされた値をチェックすることができるようになりました。


CC BY-SA 3.0
2017-10-16T22:21:22.993
38771
2017-10-16T22:21:22.993
2214
38519
answer