2017-08-08 26 views
0

创建测试:空指针运行时测试机器人嘲笑

class MenuPresenterTest { 

    lateinit var presenter: MenuPresenter 
    lateinit var view: MenuView 

    @Before fun setUp() { 
     view = mock(MenuView::class.java) 
     presenter = MenuPresenter() 
    } 

    @Test fun test_validation() { 
     presenter.openActivity() 
     verify(view).openActivity() 
    } 


} 

MenuView

interface MenuView : MvpView { 
    fun init() 
    fun openActivity() 
} 

MenuPresenter

@PerActivity 
class MenuPresenter @Inject constructor() : MvpPresenter<MenuView>() { 

    fun initView(){ 
     view.init() 
    } 

    fun openActivity(){ 
     view.openActivity() 
    } 
} 

MvpPresenter

open class MvpPresenter<V : MvpBaseView> : MvpBasePresenter<V>() { 
    // things specific for current project 

    override fun bindView(view: V) { 
     super.bindView(view) 
    } 

    override fun unbindView() { 
     super.unbindView() 
     clear() 
    } 
} 

MvpBasePresenter:

abstract class MvpBasePresenter<V : MvpBaseView> { 
    private var viewRef: WeakReference<V>? = null 
    private val disposables = CompositeDisposable() 

    fun clear() = disposables.clear() 
    fun dispose(disposable: Disposable) = disposables.add(disposable) 

    open fun bindView(view: V) { 
     viewRef = WeakReference(view) 
    } 

    open fun unbindView() { 
     viewRef = null 
    } 

    fun isViewBound() = viewRef != null 

    val view: V 
     get() { 
      if (viewRef == null) { 
       throw NullPointerException("getView() called when viewRef is null. Ensure bindView(View view) is called first.") 
      } else { 
       return viewRef!!.get() as V 
      } 
     } 


} 

当我运行测试,我得到:

java.lang.NullPointerException: getView() called when viewRef is null. Ensure bindView(View view) is called first. 
at base.MvpBasePresenter.getView(MvpBasePresenter.kt:27) 

任何想法,为什么?

回答

1

MenuPresenter() - 您不会在代码中的任何位置调用bindView,因此演示者不知道您的模拟视图。这意味着它不能只是null

+0

就是这样!我忘记了在调用方法之前在测试类中添加presenter.bindView(view)。多谢! – edi233