Android Presenter Testing IllegalStateException captor.capture()不得为null

时间:2019-04-08 17:54:47

标签: android unit-testing mockito android-mvp

我有一个基于mvp的简单应用程序。为演示者编写测试。将Mockito用于模拟数据。我使用ArgumentCaptor捕获视图回调数据(ArrayList)。我的测试班

    @RunWith(MockitoJUnitRunner::class)
    class MainPresenterTest{

    @Mock
    lateinit var view:MainView

    @Mock
    lateinit var context:Context

    @InjectMocks
    lateinit var presenter: MainPresenter

    @Captor
    lateinit var captor: ArgumentCaptor<ArrayList<News>>

    @Before
    fun init(){
        MockitoAnnotations.initMocks(this)
    }

    @Test
    fun success(){
    presenter.loadNews()
    Mockito.verify<MainView>(view).onSuccess(captor.capture())
    var data =  captor.value
    Mockito.verify(view).onSuccess(data)
    Mockito.verify(view,never()).onError("")
        }
    }

主视图

interface MainView{
    fun onSuccess(n:ArrayList<News>)
    fun onError(e:String)
}

但是扔

java.lang.IllegalStateException: captor.capture() must not be null
Example of correct verification:
    verify(mock).doSomething()

Also, this error might show up because you verify either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.
Mocking methods declared on non-public parent classes is not supported.

1 个答案:

答案 0 :(得分:0)

您实际上不需要将其定义为类lateinit变量。在测试方法中,定义一个这样的方法变量

 @Test
    fun success(){
    presenter.loadNews()
    val captor: ArgumentCaptor<ArrayList<*>> = ArgumentCaptor.forClass(ArrayList::class.java)
    Mockito.verify<MainView>(view).onSuccess(captor.capture())
    var data =  captor.value
    Mockito.verify(view).onSuccess(data)
    Mockito.verify(view,never()).onError("")
        }
    }

此外,您还应该声明来自捕获者的数据。代替这个

 Mockito.verify(view).onSuccess(data)

做这样的事情

assertEquals("x", data.size())