在集成测试中自动配置ReactiveCrudRepos

时间:2020-09-10 19:54:46

标签: spring-boot spring-webflux spring-test

我在编写一些集成测试时遇到了一些困难。我有这样的东西

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Service.class)
public class ServiceTest {
    @Rule
    public PostgreSQLContainer postgres = new PostgreSQLContainer();

    @Autowired
    Service Service;

    @Before
    public void setUp() {
        PostgresqlConnectionFactory connectionFactory = new PostgresqlConnectionFactory(PostgresqlConnectionConfiguration.builder()
                .host(postgres.getHost())
                .port(postgres.getFirstMappedPort())  // optional, defaults to 5432
                .username(postgres.getUsername())
                .password(postgres.getPassword())
                .database(postgres.getDatabaseName())  // optional
                .build());

        Resource resource = new ClassPathResource("sql.sql");

        Mono<PostgresqlConnection> mono = connectionFactory.create();
        mono.map(connection -> connection
                .createStatement(Helpers.asString(resource))
                .execute()).block();

    }

    @Test
    public void test() {
        Request Request = new Request();
        request.setName("name");
        Mono<Item> itemMono = Service.createNewHub(hubRequest);
        Item item = itemMono.block();

        Assert.assertEquals(1L, 1L);

    }
}

我的Service.class如下所示

@Service
public class Service {

    private Repository repository;

    public Service(Repository repository) {
        this.repository = repository;
    }

    public Flux<Item> getAllItems() {
            return repository.findAll();
    }
}

还有我的仓库

@Repository
public interface Repository extends ReactiveCrudRepository<Item, Integer>  {

}

我的错误如下

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.Repository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

虽然我在应用程序中编写的所有代码都可以被很好地注入,但是当涉及到ReactiveCrudRepos时,我对获取其实例化对象没有任何运气。我需要做些什么来创建和注入实现?

1 个答案:

答案 0 :(得分:0)

只要您使用@SpringBootTest(classes = Service.class),其他bean就不会加载到应用程序上下文中。注释的注释元素class描述为:

用于加载ApplicationContext组件类

删除元素并按原样使用@SpringBootApplication

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Service.class)
public class ServiceTest { /* code */ }

请记住,使用这种方法正在测试与将在生产环境中运行的应用程序上下文完全不同的应用程序上下文。应该是不得已了。


此外,避免在存在Spring注释Repository本身时命名接口@Repository。我个人更喜欢:

@Repository
public interface ItemRepository extends ReactiveCrudRepository<Item, Integer>  {

}