Android Kotlin:ArrayAdapter的单元测试getView方法

Android Kotlin:ArrayAdapter的单元测试getView方法,android,unit-testing,mockito,android-testing,mockito-kotlin,Android,Unit Testing,Mockito,Android Testing,Mockito Kotlin,我有以下简单的ArrayAdapter,我想在其上运行单元测试: class AccountSpinnerAdapter(context: Context, textViewResourceId: Int, private val values: Set<Account>) : ArrayAdapter<Account>(context, textViewResourceId, values.toList()) { override fun getCount()

我有以下简单的
ArrayAdapter
,我想在其上运行单元测试:

class AccountSpinnerAdapter(context: Context, textViewResourceId: Int, private val values: Set<Account>) : ArrayAdapter<Account>(context, textViewResourceId, values.toList()) {

    override fun getCount() = values.size
    override fun getItem(position: Int) = values.elementAt(position)
    override fun getItemId(position: Int) = position.toLong()

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val label = super.getView(position, convertView, parent) as TextView
        label.text = values.elementAt(position).displayName
        return label
    }

    override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
        val label = super.getDropDownView(position, convertView, parent) as TextView
        label.text = values.elementAt(position).displayName
        return label
    }
}
class AccountSpinerAdapter(上下文:context,textViewResourceId:Int,私有val值:Set):ArrayAdapter(上下文,textViewResourceId,values.toList()){
重写fun getCount()=values.size
覆盖fun getItem(位置:Int)=值。elementAt(位置)
覆盖getItemId(位置:Int)=位置。toLong()
覆盖视图(位置:Int,convertView:View?,父级:ViewGroup):视图{
val label=super.getView(位置、转换视图、父对象)作为文本视图
label.text=values.elementAt(位置).displayName
退货标签
}
覆盖getDropDownView(位置:Int,convertView:View?,父级:ViewGroup):视图{
val label=super.getDropDownView(位置、转换视图、父对象)作为文本视图
label.text=values.elementAt(位置).displayName
退货标签
}
}
getCount
getItem
getItemId
很容易完成

但是如何测试
getView
getDropDownView
方法?
我面临的问题是:

  • 第三个参数
    viewGroup
    不能为
    null
    。如何伪造/模拟此
    视图组
  • 这两种方法都在调用
    super.xxx
    。如何设置
    when/then
    构造,使其返回
    文本视图

简单地说,您无法测试JVM上的任何android依赖项,因为您没有上下文来获取视图或与之相关的任何内容,要测试
getView()
getDropDownView()
您有两个选项

  • 使用浓缩咖啡或同等品进行仪器测试()
  • 通过使用Robolectric编写测试,在JVM上使用Android shadows运行
  • 对于单元测试,在测试之前,应在
    @上使用
    view=mock()
    模拟整个视图

    // https://mvnrepository.com/artifact/com.nhaarman/mockito-kotlin
    testImplementation 'com.nhaarman:mockito-kotlin:1.6.0'
    
    请参阅: