Springboot:如何执行具有真实依赖项的集成测试?

Dar*_*man 4 java integration-testing dependency-injection spring-boot

我现在开始学习 Java 和 Spring boot,我在集成测试中遇到了依赖注入的一些问题。我在src/main/java/com/rfd/domain/services下有一个名为 TransactionService 的类,它被标记为 @Service 并且它有另一个依赖项,其中一个是由 Spring Boot 创建的存储库。当我启动应用程序时,它会正确启动,因此我假设依赖项正在正确解析。这是总结类:

package com.rfd.domain.services;

import allNeededImports

@Service
public class TransactionsService {

    @Autowired
    private KambiTransactionRepository kambiTransactionRepository;

    @Autowired
    private TransactionFactory transactionFactory;

    public List<Transaction> retrieveTransactions(String couponExternalId) throws InvalidTransactionException {
        // someCode
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我在/src/test/java/com/rfd/integrationtests/domain/services下有一个 TransactionsServiceTests 类:

package com.rfd.integrationtests.domain.services;
import allNeededImports

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Main.class)
@DataMongoTest
@TestPropertySource(locations = "classpath:application-integrationtest.properties")
public class TransactionsServiceTests {

    @Autowired
    private TransactionsService transactionsService;

    @Test
    public void retrieveTransactions_happyPathMultipleTransactions_transactionsRetrieved() throws InvalidTransactionException {
        // test code
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试启动测试时,收到以下错误:

引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用的“com.rfd.domain.services.TransactionsService”类型的合格bean:预计至少有1个bean有资格作为自动装配候选。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}

我试图创建我自己的 @TestConfiguration 类,在其中创建了一个用 @Bean 标记的方法并返回一个新的 TransactionService 实例,它可以工作。但是,现在的错误是针对 KambiTransactionRepository 依赖项,我没有它的实现,因为它是由 spring boot 给出的:

package com.rfd.infrastructure.repositories;

import com.rfd.infrastructure.models.KambiTransaction;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface KambiTransactionRepository extends MongoRepository<KambiTransaction, String> {

    List<KambiTransaction> findByCouponRef(String couponRef);
}
Run Code Online (Sandbox Code Playgroud)

问题 如何使用主代码的依赖解析来执行集成测试?

Dar*_*man 8

正如@M.Deinum 在评论中所说,@SpringBootTest并且@DataMongoTest是相互排斥的,因此删除@DataMongoTest解决了问题。

但是,如果你仍然想使用@DataMongoTest注解,你可以使用这句话:

@DataMongoTest(includeFilters = @ComponentScan.Filter(Service.class))
Run Code Online (Sandbox Code Playgroud)

这样,所有被注释的类都@Component将被加载和自动装配。这包括(除其他外)@Service,@Repository@Controller