0

我有以下简单ArrayAdapter的东西,我想在上面运行 UnitTests:

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
    }
}

getCount,getItem并且getItemId很容易做到。

但是我怎样才能测试getViewgetDropDownView方法呢?我面临的问题是:

  • 第三个参数viewGroup不能null。如何伪造/模拟这个ViewGroup
  • 两种方法都在调用super.xxx。我怎样才能建立一个when/then构造让它返回一个TextView
4

2 回答 2

0

只是您无法测试对 JVM 的任何 android 依赖项,因为您没有能够获取视图或与之相关的任何内容的上下文来进行测试getView(),并且getDropDownView()您有 2 个选项

  1. 使用 espresso 或同等产品编写 Instrumentation 测试 ( https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests )
  2. 使用 Robolectric,使用 Android 阴影编写测试以在 JVM 上运行,http: //robolectric.org
于 2019-10-26T20:15:00.663 回答
0

对于单元测试,应该在测试中模拟整个view = mock()视图@Before

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

请参阅:使用 Mockito 进行 Android 单元测试

于 2019-10-26T20:40:34.257 回答