Reflection Kotlin绑定的可调用引用不一致
今天我在Android应用程序中为我的演示者创建单元测试,我注意到绑定的可调用引用存在一些不一致。它是在开发中还是语言错误?我在kotlin 1.1中发现绑定的可调用引用是受支持的。但是我的代码在kotlin 1.1.2-4中失败了 在我的presenter类中,测试过的方法从数据库中读取数据,并且Reflection Kotlin绑定的可调用引用不一致,reflection,kotlin,Reflection,Kotlin,今天我在Android应用程序中为我的演示者创建单元测试,我注意到绑定的可调用引用存在一些不一致。它是在开发中还是语言错误?我在kotlin 1.1中发现绑定的可调用引用是受支持的。但是我的代码在kotlin 1.1.2-4中失败了 在我的presenter类中,测试过的方法从数据库中读取数据,并且dao.getAllItems()方法在视图获取列表时没有参数-->view.showData(list) 我正在使用Mockito、RxJava2和Room持久性库 class ItemsPrese
dao.getAllItems()
方法在视图获取列表时没有参数-->view.showData(list)
我正在使用Mockito、RxJava2和Room持久性库
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) }
)
}
}
当我按照上述方式进行设置时,测试将顺利通过。但当我换行时{data->view.showData(数据)}
到
{view::showData}
然后我的测试失败了
Wanted but not invoked:
itemsView.showData([]);
是语言错误吗?因为易受攻击的代码可以很好地编译并运行,所以它只会导致根本不调用该方法,而不会出现任何错误
为了澄清这一点,用Java8编写的代码也可以正常工作,lambda参数被正确地传递到方法引用中。正如您在Kotlin绑定的可调用引用中所看到的,当与不带参数的方法一起使用时,可以很好地工作,否则根本不会调用它们。您应该进行更改
{ data -> view.showData(data) }
到
正确传入方法引用。这样,使用()
,您将方法引用作为subscribe
方法的参数传递
使用
{}
,您可以定义一个新函数,其中lambda将被赋予subscribe
方法
写下
{ view::showData }
相当于
{ it -> view::showData }
这是一个忽略其参数的函数,并返回方法引用
view::showData
您是对的,这就是答案。有点误导的是,您可以将参数传递到lambda函数中,而不传递任何参数,然后实际编译代码。1.1.3将包含检测这些情况的检查:哦,这真是太好了。
{ view::showData }
{ it -> view::showData }