我在编写一些集成测试时遇到了一些困难。我有这样的东西
@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时,我对获取其实例化对象没有任何运气。我需要做些什么来创建和注入实现?
答案 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> {
}