如何使用 RxJava TestObserver 断言两个字符串列表?

How to assert two list of string using RxJava TestObserver?

在此测试中,这两个字符串列表相同,但 assertValue 方法告诉我它们不相等,因为它们具有不同的内存地址。我怎样才能让它针对数组中的实际字符串进行测试,以便以下内容通过?

@Test
public void shouldReturnStringList() {;
    String[] strings = {"Hello", "World"};
    String[] strings2 = {"Hello", "World"};
    Observable<String[]> stringsObservable = Observable.just(strings);

    TestObserver<String[]> testObserver = new TestObserver<>();
    stringsObservable.subscribe(testObserver);

    testObserver.assertValue(strings2);
}

失败的测试消息:

java.lang.AssertionError: Expected: [Ljava.lang.String;@5ebec15 (class: String[]), Actual: [Ljava.lang.String;@21bcffb5 (class: String[]) (latch = 0, values = 1, errors = 0, completions = 1)

由于 assertValue 使用基本的 Object.equals 进行比较,因此数组将失败,因为它们只比较地址,而不是值。

您需要使用运算符的 assertValue(Predicate<T>) 版本,然后使用 Arrays.equals(Object[],Object[]) 进行实际比较:

testObserver.assertValue(arr -> Arrays.equals(arr, strings2))