小编典典

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

spring-boot

我现在开始学习Java和Spring引导,并且在集成测试中依赖注入有一些问题。我在 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
    }
}

现在,我在 / 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
    }

当我尝试启动测试时,出现以下错误:

原因: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);
}

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


阅读 562

收藏
2020-05-30

共1个答案

小编典典

由于@
M.Deinum在评论中指出,@SpringBootTest并且@DataMongoTest是互斥的,因此删除可以@DataMongoTest解决问题。

但是 ,如果仍然要使用@DataMongoTest注释,则可以使用以下语句:

@DataMongoTest(includeFilters = @ComponentScan.Filter(Service.class))

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

2020-05-30