【问题标题】:Mockito - RuntimeException: Stub! when mocking RecyclerView.AdapterMockito - RuntimeException:存根!模拟 RecyclerView.Adapter 时
【发布时间】:2019-11-28 01:33:00
【问题描述】:

我有一个以

身份运行的测试
@RunWith(MockitoJUnitRunner.StrictStubs::class)
class MyAdapterTest {

    @Mock
    private lateinit var clickListener: MyAdapter.Listener

    private val options: MutableList<Option> = mutableListOf()
    private lateinit var myAdapter: MyAdapter
    private val mockModels = MockModels()


    @Before
    fun init() {

        MockitoAnnotations.initMocks(this);

        options.add(mockModels.getOption())

        myAdapter = MyAdapter(options, clickListener)  // <-- This line fails

    }

    @Test
    fun `Get item count`() {
        Assert.assertEquals(myAdapter.itemCount, options.size)
    }

}

在哪里

class MyAdapter(val options: MutableList<Option>,
                             val clickListener: Listener) :
        RecyclerView.Adapter<MyAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)
            = ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_option, parent, false))

    override fun getItemCount() = options.size

...

}

当这是运行时,我得到一个异常:

java.lang.RuntimeException: 存根!

观察堆栈跟踪可能是因为Observable 没有实现,因为它是来自 Android 库的存根。

at android.database.Observable.<init>(Observable.java:34)
at android.support.v7.widget.RecyclerView$AdapterDataObservable.<init>(RecyclerView.java:11774)
at android.support.v7.widget.RecyclerView$Adapter.<init>(RecyclerView.java:6593)
at com.my.project.adapters.MyAdapter.<init>(MyAdapter.kt:23) <<<- Super Constructor
at com.my.project.adapters.MyAdapterTest.init(MyAdapterTest.kt:41) << @Before 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitForkedStarter.main(JUnitForkedStarter.java:41)

【问题讨论】:

    标签: android junit android-recyclerview mocking mockito


    【解决方案1】:

    在单元测试中访问 Android 代码会出现此错误。

    您可以尝试的一种方法是将其添加到您的build.gradle

    android { 
         //... 
         testOptions { 
              unitTests.returnDefaultValues = true 
         }
    }
    

    一般来说,当您需要 Android 代码时,最好使用 Instrumentation 测试。

    【讨论】:

    • 我已经有了,似乎每当我一次对多个模块运行测试时,所有模块的returnDefaultValues 值都设置为false,而不是为每个模块的测试单独设置
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    相关资源
    最近更新 更多