我有一个基于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.
答案 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())