r2dbc 单元测试 - 保存实体后存储库不返回任何内容

问题描述

我正在使用 R2DBC MysqL 学习 Reative jdbc。我有一个这样的存储库:

public interface UserRepository extends ReactiveCrudRepository<User,Long> {

    Mono<User> findByEmail(String email);

我创建了一个单元测试,以便使用 H2 中的内存数据库测试存储库。测试文件如下所示:

@RunWith(springrunner.class)
@DataR2dbcTest
@TestPropertySource(locations = "classpath:application-test.properties")
public class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @BeforeClass
    public static void initDataBase() {
        ConnectionFactory connectionFactory = ConnectionFactories.get("r2dbc:h2:mem:///testdb;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;");
        DatabaseClient databaseClient = DatabaseClient.create(connectionFactory);
        R2dbcEntityTemplate template = new R2dbcEntityTemplate(databaseClient);

        String query = "create table user (id int unsigned not null AUTO_INCREMENT,email varchar(50) not null,password varchar(100) not null,first_name varchar(50) not null,last_name varchar(50) not null,description varchar(50),phone_number varchar(50),user_image_id int unsigned,need_refresh_pass boolean not null,PRIMARY KEY (id));";
        template.getDatabaseClient().execute(query).fetch().rowsUpdated().block();
    }

方法会创建表,因为 R2DBC 不会自动创建它。 然后我进行了测试:

@Test
public void whenFindingAnUserReturnTheUserIfExist() {
    User user = new User("email@mail.com","pass","name","lastNmae","description","123123");
    userRepository.save(user);
    StepVerifier.create(userRepository.findByEmail("email@mail.com")).expectNextMatches(userCreated -> userCreated.getEmail().equals("email@mail.com")).verifyComplete();
}

当我运行测试时,控制台显示

java.lang.AssertionError:期望“expectNextMatches”失败(预期:onNext();实际:onComplete())

findByEmail 方法似乎没有返回任何内容。 我做错了什么?

POM 文件

   <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-r2dbc</artifactId>
        </dependency>

        <!-- For testing possibility -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>dev.miku</groupId>
            <artifactId>r2dbc-MysqL</artifactId>
            <version>0.8.2.RELEASE</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>io.r2dbc</groupId>
            <artifactId>r2dbc-h2</artifactId>
        </dependency>

解决方法

我意识到了我的错误。 我忘了将 .subscribe() 添加到方法 userRepository.save(user);

所以测试方法是:

@Test
public void whenFindingAnUserReturnTheUserIfExist() {
    User user = new User("email@mail.com","pass","name","lastNmae","description","123123");
    userRepository.save(user).subscribe();
    StepVerifier.create(userRepository.findByEmail("email@mail.com")).expectNextMatches(userCreated -> userCreated.getEmail().equals("email@mail.com")).verifyComplete();
}