如何将Reactive Java的StepVerifier应用到Pojo上

3
我有以下代码(请参见下文),它成功地使用StepVerifier调用ParsePerson :: Parse方法,然后期望"John"和"Mary"的expectNext。
如果ParsePerson :: Parse方法返回一个Person(而不是一个String),我该如何更改StepVerifier以检查每个Person的属性。 与"testPerson"相同的方式
package com.chocksaway;

import org.junit.jupiter.api.Test;
import reactor.core.publisher.Flux;
import reactor.test.StepVerifier;

/**
 * Author milesd on 24/04/2022.
 */
public class TestFluxFilterMono {

    @Test
    public void testPerson() {
        Person john = new Person("John", 22);
        StepVerifier.create(Flux.just(john.getName(), john.getAge()))
                    .expectNext("John", 22)
                    .expectComplete()
                    .verify();
    }

    @Test
    public void testCallParse() {
        StepVerifier.create(ParsePerson.parse())
                .expectNext("John")    // how would I check for a Person "John", 22?
                .expectNext("Mary")    // how would I check for a Person "Mary", 33?
                .verifyComplete();
    }
}

class ParsePerson {
    static Flux<String> parse() {
        Flux<Person> peopleList = Flux.just(new Person("John", 22), new Person("Mary", 33));

        return peopleList
                .filter(each -> each.getAge() > 20)
                .map(Person::getName);
    }
}

class Person {
    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }
}
1个回答

3

解决方案1

  1. 根据agename字段为您的Person类定义equalshashCode方法:
class Person {

    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    @Override
    public boolean equals(final Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        final Person person = (Person) o;
        return getAge() == person.getAge() && Objects.equals(getName(), person.getName());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getName(), getAge());
    }
}

修改parse方法:
static Flux<Person> parse() {
    Flux<Person> peopleList = Flux.just(new Person("John", 22), new Person("Mary", 33));
    return peopleList
            .filter(each -> each.getAge() > 20);
}

测试方法如下:
@Test
public void testCallParse2() {
    StepVerifier.create(ParsePerson.parse())
            .expectNext(new Person("John", 22)) 
            .expectNext(new Person("Mary", 33))
            .verifyComplete();
}

解决方案 2

使用consumeNextWith并在其中断言字段:

@Test
public void testCallParse2() {
    StepVerifier.create(ParsePerson.parse())
            .consumeNextWith(person -> {
                assertEquals("John", person.getName());
                assertEquals(22, person.getAge());
            })
            .consumeNextWith(person -> {
                assertEquals("Mary", person.getName());
                assertEquals(33, person.getAge());
            })
            .verifyComplete();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接