gpt4 book ai didi

reflection - Kotlin 绑定(bind)的可调用引用不一致

转载 作者:行者123 更新时间:2023-12-02 13:15:17 31 4
gpt4 key购买 nike

今天我在 Android 应用程序中为我的 Presenter 创建单元测试,我注意到绑定(bind)的可调用引用存在一些不一致。是在开发中还是语言错误?我找到了that在 kotlin 1.1 中支持绑定(bind)可调用引用。但是我的代码在 kotlin 1.1.2-4 上失败了。

在我的演讲者类(class)中,测试方法从数据库中读取数据,dao.getAllItems() View 获取列表时方法没有参数 --> view.showData(List<Item>) .

我正在使用 Mockito、RxJava2 和 Room Persistance 库。

class ItemsPresenter @Inject constructor(private val itemDao: ItemDao) : Presenter<ItemsView>
{
val TAG = this.javaClass.name!!
private val disposables: CompositeDisposable = CompositeDisposable()
private lateinit var view: ItemsView

override fun onCreate(view: ItemsView)
{
this.view = view
}

override fun onDestroy()
{
disposables.clear()
}

fun onGetItems()
{
Observable.fromCallable(itemDao::getAllItems)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ data -> view.showData(data) },
{ throwable -> view.showLoadingDataError(throwable.localizedMessage) }
)
}
}

我为 onGetItems() 创建了测试方法
@RunWith(KotlinTestRunner::class)
class ItemsPresenterTest
{
private lateinit var view: ItemsView
private lateinit var dao: ItemDao
private lateinit var presenter: ItemsPresenter

@Before
fun setup()
{
RxAndroidPlugins.setInitMainThreadSchedulerHandler { Schedulers.io() }
dao = mock(ItemDao::class.java)
view = mock(ItemsView::class.java)
presenter = ItemsPresenter(dao)
}

@Test
fun onGetItemsTest()
{
val list = ArrayList<Item>()
When(dao.getAllItems()).thenReturn(list)
presenter.onCreate(view)
presenter.onGetItems()

verify(dao).getAllItems()
verify(view).showData(list)
}
}

当我进行上述设置时,测试通过没有问题。但是当我换线时 { data -> view.showData(data) }

{ view::showData }
然后我的测试失败说
Wanted but not invoked:
itemsView.showData([]);

是语言错误吗?因为易受攻击的代码编译良好并运行,它只是导致方法根本不被调用,没有任何错误。

澄清一下,用 Java 8 编写的相同代码可以正常工作,lambda 参数正确传递到方法引用中。正如您在 Kotlin 中看到的,绑定(bind)可调用引用在与不带参数的方法一起使用时可以正常工作,否则根本不会调用它们。

最佳答案

你应该改变

{ data -> view.showData(data) }


(view::showData)

正确传递方法引用。这样,与 () ,您将方法引用作为 subscribe 的参数传递方法。

使用 {} ,您定义了一个新函数,其 lambda 被赋予 subscribe方法。

写下来
{ view::showData }

相当于
{ it -> view::showData }

这是一个忽略其参数并返回方法引用 view::showData 的函数.

关于reflection - Kotlin 绑定(bind)的可调用引用不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44456457/

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