gpt4 book ai didi

android - 如何测试它在 rxjava map/flatmap 中的模拟交互

转载 作者:行者123 更新时间:2023-11-29 15:35:32 32 4
gpt4 key购买 nike

我正在尝试使用 mockito 测试此代码。

public class Repository {
...
@Override
public Observable<Data> getCurrentData() {
return api.getData()
.map(entityMapper::transform);
}
}

我想测试 entityMapper 交互。这是我的测试场景:

@Test
@Throws(Exception::class)
fun getData() {
//given
whenever(api.getData).thenReturn(Observable.just(Data()))
//when
debitCardRepo.getCurrentData
//then
verify(api).getData
//TODO verify entityMapper interaction
}

如果我尝试 verify(entityMapper).transform(anyOrNull<>()) , 我会得到 Wanted but not invoked:有谁知道如何在 map/flapmap 中测试模拟交互?

最佳答案

Does anyone knows how to test an mock interaction inside a map/flapmap?

假设你类的其他人是这样的:

public class Repository {

private final EntityMapper

public Repository(EntityMapper entityMapper) {
this.entityMapper = entityMapper;
}

@Override
public Observable<Data> getCurrentData() {
return api.getData()
.map(entityMapper::transform);
}
}

如果您等待 Observable 完成,那么在模拟的 EntityMapper 上 stub 一个行为将起作用:

@Test
@Throws(Exception::class)
fun testGetData() {
//given
val data = Data()
whenever(api.getData).thenReturn(Observable.just(data))
//when
repository.getCurrentData().blockingGet()
//then
verify(entityMapper).transform(any())
}

请注意对 blockingGet() 的调用 - 否则测试可能会在映射发生之前完成。您还应该查看 Observable#test() 方法以在此处查看更好的选项。

但是在这种情况下,由于存储库除了委托(delegate)给 API 和调用 EntityMapper 之外几乎没有做任何事情,而这似乎是您感兴趣的主要交互,为什么不测试 EntityMapper 分开?

如果您为 EntityMapper 编写单独的测试,那么您可以使用黑盒测试(只需对您的数据调用 transform 并查看转换是否符合您的预期) .这种测试比使用 verify 的白盒测试更稳定和更有值(value),后者有时会退化为被测系统的反向实现测试。

关于android - 如何测试它在 rxjava map/flatmap 中的模拟交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51181431/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com