首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模拟Parcel.recycle()?

如何模拟Parcel.recycle()?
EN

Stack Overflow用户
提问于 2018-06-15 14:52:31
回答 1查看 475关注 0票数 1

在我们的Android应用程序中,部分是用Kotlin编写的,我们管理医疗案例。用户可以编辑它们。我们通过在演示程序中创建一个克隆来验证更改,只更改副本并将其与原始副本进行比较。我使用Parcelable来克隆case对象,如下所示:

代码语言:javascript
复制
public Case cloneObject() {
    Parcel parcel = null;
    try {
        parcel = Parcel.obtain();
        parcel.writeParcelable(this, 0);
        parcel.setDataPosition(0);
        return parcel.readParcelable(Case.class.getClassLoader());
    } finally {
        if (parcel != null) {
            parcel.recycle();
        }
    }
}

在该应用程序中,我们验证了对以下情况的更改:

代码语言:javascript
复制
override fun validateHasChanges(): Boolean {
    return !(model.updatedCase.title == model.originalCase.title &&
            model.updatedCase.description == model.originalCase.description &&
            model.updatedCase.category == model.originalCase.category &&
            model.updatedCase.visibility == model.originalCase.visibility &&
            areCaseFilesEqual() &&
            model.updatedCase.recommendedFor == model.originalCase.recommendedFor &&
            !model.wasConsentClicked &&
            !model.wasImagesClicked)
}

现在,我想编写一个单元测试,并验证上面的正确性。问题是,Parcel有静态的和最终的方法,也有一个最终的void方法,即循环()。我使用PowerMockito来克服大部分这些问题,但是在花了好几天的时间之后,我还是不能模拟循环利用。这就是它目前的样子。

代码语言:javascript
复制
@RunWith(PowerMockRunner::class)
@PrepareForTest(Case::class, Parcel::class)
class QuickPostTest : BehaviorSpec() {

@Test
fun `validate has changes when category is different`() {
    PowerMockito.mockStatic(Parcel::class.java)
    val spy = PowerMockito.spy(Case())
    val spy2 = PowerMockito.mock(Parcel::class.java)
    PowerMockito.doNothing().`when`(spy2.recycle())
    //suppress(method(Parcel::class.java, "recycle"))
    Mockito.`when`(Parcel.obtain()).thenReturn(Whitebox.newInstance(Parcel::class.java))
    Mockito.`when`(spy.cloneObject()).thenReturn(cloneObject(spy))
    val originalCase = Case()
    originalCase.title = "Cool"
    val specialty = Specialty()
    specialty.id = "anaesthetics"
    val specialty2 = Specialty()
    specialty2.id = "anaesthetics.anaesthesia.cardiothoracic"
    originalCase.addSpecialty(specialty)
    val model = BaseCreateCaseModel(originalCase, true)
    model.updatedCase.addSpecialty(specialty2)
    val presenter = CreateCaseQuickPresenter(originalCase)
    presenter.setModel(model)
    assertTrue(presenter.validateHasChanges())
}

private fun cloneObject(aCase: Case): Case {
    var parcel: Parcel? = null
    try {
        parcel = Parcel.obtain()
        parcel!!.writeParcelable(aCase, 0)
        parcel.setDataPosition(0)
        return parcel.readParcelable(Case::class.java.classLoader)
    } finally {
        if (parcel != null) {
            parcel.recycle()
        }
    }
}

}

我应该如何修改它以使它工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-22 23:15:52

这不是我问题的直接答案,但我相信这是正确的。我选择了Parcel来克隆,因为我确信这是最简单的解决方案,因为Java中可复制的接口被破坏了,而复制构造函数太复杂了。但我错了。将Parcelable添加到我的模型中,并在我的演示程序中添加Android依赖。结果,在这种情况下,复制构造函数并不是那么复杂,即使我的类层次结构非常深。所以我做了这个,除掉了间谍,现在起作用了。我必须保留PowerMockito,因为我需要Parcelable来传递Case对象,但是我不需要它在演示者中,所以mockStatic就足够了。

下面是测试的样子:

代码语言:javascript
复制
@RunWith(PowerMockRunner::class)
@PrepareForTest(Case::class, Parcel::class)
class QuickPostTest : BehaviorSpec() {

   @Test
   fun `validate has changes when category is different`() {
      PowerMockito.mockStatic(Parcel::class.java)
      val originalCase = Case()
      originalCase.title = "Cool"
      val specialty = Specialty()
      specialty.id = "anaesthetics"
      specialty.isActive = true
      val specialty2 = Specialty()
      specialty2.id = "anaesthetics.anaesthesia.cardiothoracic"
      specialty2.isActive = true
      originalCase.addSpecialty(specialty)
      val model = BaseCreateCaseModel(originalCase, true)
      model.updatedCase.addSpecialty(specialty2)
      val presenter = CreateCaseQuickPresenter(originalCase)
      presenter.setModel(model)

      assertTrue(presenter.validateHasChanges())
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50878002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档