小编Seb*_*ian的帖子

RxJava获取链式网络请求中先前可观察到的结果

我的应用程序中有2个服务端点,a并且b(两个都是“ Singles”)。服务请求b取决于的响应a。在响应之后,b我需要访问订户中的两个响应。我打算这样打电话:

services.a()
    .flatMap(a -> services.b(a))
    .subscribe(b ->
        // Access a and b here
    )
Run Code Online (Sandbox Code Playgroud)

但是通过这种方式,我只能访问b订户中的结果。我又如何传递对此的回应a

我的第一个尝试是使用类似这样的东西:

// Note: Code will not compile... Just to show the concept
services.a()
    .flatMap(
        a -> Observable.combineLatest(
                Observable.just(a)
                services.b(a).toObservable()
                Bifunction((a, b) -> {return Pair<ResponseA, ResponseB>(a, b)}))
    )
    .toSingle()
    .subscribe(pair -> {
        ResponseA a = pair.first();
        ResponseB b = pair.second();
    })
Run Code Online (Sandbox Code Playgroud)

但是随着用例变得更加复杂,代码将演变为丑陋的怪物。

java rx-java rx-java2

6
推荐指数
1
解决办法
1616
查看次数

如何设计单元测试类

我有一个如下所示的 Java 类:

public class MyClass {

    /** Database Connection. */
    private dbCon;

    public MyClass() {
        dbCon = ...
    }

    public void doSomethingWith(MyData data) {
        data = convertData(data);
        dbCon.storeData(data);
    }

    private MyData convertData(MyData data) {
        // Some complex logic...
        return data;
    }
}
Run Code Online (Sandbox Code Playgroud)

由于这个类的真正逻辑在于convertData()方法,所以我想为这个方法编写一个单元测试。所以我读了这篇文章

如何测试私有函数或具有私有方法、字段或内部类的类?

很多人说需要测试私有方法是一种设计味道。怎样才能做得更好呢?

我看到两种方法:

  1. convertData()使用公共 api 将方法提取到某个实用程序类中。但我认为这也是一种不好的做法,因为此类实用程序类将违反单一责任原则,除非我创建大量可能只有一两个方法的实用程序类。

  2. 编写第二个允许注入的构造函数dbCon,这允许我注入数据库连接的模拟版本并针对公共doSomething()方法运行测试。这将是我首选的方法,但也有关于模拟的需要如何也是一种代码味道的讨论。

对于这个问题有什么最佳实践吗?

java unit-testing

2
推荐指数
1
解决办法
463
查看次数

TornadoFX绑定不同视图模型的脏属性

我在模型的MVVM模式之后有一个tornadoFX应用程序:

data class Person (
    val name: String,
    val cars: List<Car>
)

data class Car (
    val brand: String,
    val model: String
)
Run Code Online (Sandbox Code Playgroud)

该应用程序定义以下视图:

在此处输入图片说明

有一个列出所有人员的列表视图。除了listView之外,还有一个详细信息视图,其中包含用于该人姓名的文本字段和用于该人的汽车的表格视图。
双击表中的汽车条目会打开一个对话框,您可以在其中编辑汽车的属性。

我想要,如果我打开汽车细节并编辑条目,那么更改将反映在表格视图中。由于我无法通过添加fx-properties来更改Car模型(这是不可变的类型),因此我提出了以下视图模型:

class PersonViewModel(): ItemViewModel<Person> {
    val name = bind(Person::name)
    val cars = bind { SimpleListProperty<CarViewModel>(item?.cars?.map{CarViewModel(it)}?.observable()) }

    override fun onCommit {
        // create new person based on ViewModel and store it
    }
}

class CarViewModel(item: Car): ItemViewModel<Car> {
    val brand = bind(Car::name)
    val model = bind(Car::model)

    init {
        this.item = item
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,如果双击表视图中的汽车条目并打开汽车详细视图,则对汽车的更新将直接反映在表视图中。

我的问题是,我找不到将表中所有CarViewModel的脏属性绑定到PersonViewModel的方法。因此,如果我换车,PersonViewModel不会被标记为脏车。 …

kotlin tornadofx

0
推荐指数
1
解决办法
536
查看次数

标签 统计

java ×2

kotlin ×1

rx-java ×1

rx-java2 ×1

tornadofx ×1

unit-testing ×1