2017-07-12 19 views
3

私は次のコードを持っている:嘲笑オブジェクト

@RunWith(MockitoJUnitRunner::class) 
class OnboardingViewModelTest { 

    @Mock lateinit var authService : AuthService 
    lateinit var internetProvider: InternetStatusProvider 
    private lateinit var viewModel: OnboardingViewModel 

    @Before 
    fun setup() { 
     internetProvider = mock() 
     whenever(internetProvider.hasInternet()).thenReturn(true) 
    } 

InternetStatusProviderのコンストラクタはそうのようになります。

InternetStatusProvider(context:Context)

internetProvider.hasInternet()をスタブするとき、私はNullPointerExceptionを取得していますがメソッドの実装ではコンストラクタで渡されたcontextが使用され、実際のメソッドが呼び出されているためです。

私はここで何が欠けていますか?全体のポイントは、このメソッドの実際の実装をスタブすることですか?

+1

'hasInternet()'関数のシグニチャは何ですか? 'open'でなければ、Mockitoは最終メソッドをスタブすることができないので、' internetProvider.hasInternert() 'が呼び出されます。 – nhaarman

+0

天才、かなり明白なはずでしたね。だからスタッブされたメソッドを開く必要があります...私はこれが好きか分かりません。これを回答として提出していただければ受け入れます。 – StuStirling

答えて

9

Mockitoは最終的なメソッドをスタブできません。模擬インスタンスから最終メソッドを実行しようとすると、実際のコードが実行されます。 Kotlinの機能はデフォルトでfinalなので、open修飾子を関数に追加する必要があります。

もあります。で、最終的なクラスとメソッドの模擬を可能にしています。これは一見価値があります。

+0

インラインバージョンのMockitoを使用して簡単に始めることができます(https://stackoverflow.com/a/43310572/4465208)。 – zsmb13

関連する問題