当前位置: 首页 > 知识库问答 >
问题:

Springboot:如何使用真正的依赖关系执行集成测试?

姬高扬
2023-03-14

我现在开始学习Java和Spring Boot,并且在集成测试中遇到了一些依赖注入问题。我在src/main/java/com/rfd/domain/service下有一个名为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
    }

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

原因:组织。springframework。豆子。工厂NoSuchBeanDefinitionException:没有类型为“com”的限定bean。rfd。领域服务。TransactionService“可用:至少需要1个符合autowire候选条件的bean。依赖项注释:{@org.springframework.beans.factory.annotation.Autowired(必需=true)}

我尝试创建自己的@TestConfiguration类,在该类中,我创建了一个标记为@Bean的方法,并返回了TransactionService的一个新实例,它可以正常工作。然而,现在的错误是针对KambitTransactionRepository依赖项的,我没有实现它,因为它是由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);
}

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

共有2个答案

席弘图
2023-03-14

我需要为我的存储服务添加测试,还需要自动连线MongoRepository。这个问题的答案并没有解决我的问题。然而,我找到了一个解决方案,并将在这里分享,以防其他人需要。我的解决方法如下:

存储库:

@Repository
public interface MyRepository extends MongoRepository<MyEntity, String> {
}

实体:

@Document(collection = "my_entity")
public class MyEntity {
    @Id
    private String id;
}

服务:

@Service
public class StorageServiceImpl implements StorageService {
    private final MyRepository repository;

    public StorageServiceImpl(MyRepository repository) {
        this.repository = repository;
    }
...
}

测试:

@Import(ObjectMapperConfiguration.class)
@DataMongoTest
class StorageServiceImplTest {

    @Autowired
    private MyRepository repository;

    private StorageService storageService;

    @BeforeEach
    void setup() {
        storageService = new StorageServiceImpl(repository);
        var entity = new MyEntity();
        repository.save(entity);
    }

    @Test
    void create() {
        assertEquals(1, repository.count());
        var entity = storageService.create();
        assertEquals(2, repository.count());
    }
...
}

测试配置:

@TestConfiguration
public class ObjectMapperConfiguration {
    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper();
    }
}

测试应用程序

@SpringBootApplication
public class TestApplication {
}
宋建本
2023-03-14

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

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

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

这样,所有带有组件注释的类都将被加载并自动连接。这包括(除其他外)<代码>@服务、<代码>@存储库和<代码>@控制器。

 类似资料:
  • 我在读OOOE(无序执行)以及如何解决虚假依赖关系(通过使用重命名)。 但我的问题是,我们如何解决真正的依赖关系(RAW-写后读)? 例如: 如果CPU选择在#1之前运行#2,则重命名在此处没有帮助。

  • 我使用Intelli J IDE构建一个包含所有依赖项和测试类的可执行JAR。 /src/main/java/META-INF/MANIFEST.MF是 清单版本:1.0主类:org.testng.testng 当我用命令运行jar时 java-jartahoe-test.jarorg.testng.TestNG套件/t123.xml 我得到一个错误: 错误:无效或损坏的jar文件tahoe-te

  • 在上面的MIPS代码中,在解决方案表中,真正的依赖项标记为I3-

  • 我有几个繁重的Spring集成测试(是的,这不是最好的方法,我没有时间正确地模拟所有外部dep) 下面是测试的典型注释 由于以下原因,测试会定期失败: 这里有两个问题:1、让测试共存的正确方式是什么?我在surefire插件中设置了forkCount=0。好像有帮助 2.1. 在每次测试期间,我实际上不需要启动所有的

  • 我有一个简单的maven插件,它依赖于父pom文件。父pom文件有十个(10个)第三方jar依赖项,这些依赖项已经使用以下命令安装在我的本地回购中。 类似地,我已经安装了所有其他9个罐子到我的本地回购。这是uber pom.xml文件。 我也尝试使用uber-pom作为一个插件依赖,因为我是绝望的。有什么想法吗?

  • 我能够部署一个RESTEasy应用程序,可以很好地使用Weld(这意味着我的CDI可以工作),但我在集成测试中遇到了一些麻烦。我得到这个错误: 在测试时: 日志中的最后一条消息是