在我们的Android应用程序中,部分是用Kotlin编写的,我们管理医疗案例。用户可以编辑它们。我们通过在演示程序中创建一个克隆来验证更改,只更改副本并将其与原始副本进行比较。我使用Parcelable来克隆case对象,如下所示:
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();
}
}
}在该应用程序中,我们验证了对以下情况的更改:
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来克服大部分这些问题,但是在花了好几天的时间之后,我还是不能模拟循环利用。这就是它目前的样子。
@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()
}
}
}}
我应该如何修改它以使它工作?
发布于 2018-06-22 23:15:52
这不是我问题的直接答案,但我相信这是正确的。我选择了Parcel来克隆,因为我确信这是最简单的解决方案,因为Java中可复制的接口被破坏了,而复制构造函数太复杂了。但我错了。将Parcelable添加到我的模型中,并在我的演示程序中添加Android依赖。结果,在这种情况下,复制构造函数并不是那么复杂,即使我的类层次结构非常深。所以我做了这个,除掉了间谍,现在起作用了。我必须保留PowerMockito,因为我需要Parcelable来传递Case对象,但是我不需要它在演示者中,所以mockStatic就足够了。
下面是测试的样子:
@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())
}
}https://stackoverflow.com/questions/50878002
复制相似问题