在集成测试中自动配置ReactiveCrudRepos

问题描述

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

@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时,我对获取其实例化对象没有任何运气。我需要做些什么来创建和注入实现?

解决方法

只要您使用@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>  {

}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...