gpt4 book ai didi

java - 测试中的 Spring Boot 覆盖接口(interface)

转载 作者:行者123 更新时间:2023-11-30 08:35:26 26 4
gpt4 key购买 nike

我有一个 springboot 应用程序 (v1.3.5)

我的主要应用程序:

@SpringBootApplication
@ComponentScan({"com.akrome"})
public class InboxCoreApplication {
public static void main(String[] args) {
SpringApplication.run(InboxCoreApplication.class, args);
}
}

在包的某处我有一个定义为实现的 repo :

@Repository
public class CouchbaseServiceImpl implements CouchbaseService {

在其他地方我有一个使用该接口(interface)的类:

@Repository
public class InboxObjectRepositoryImpl {
@Autowired
private CouchbaseService couchbaseService;

我还有一个测试版的界面:

@Repository
public class CouchbaseServiceTestImpl implements CouchbaseService {

现在。在我的测试中,我想简单地将接口(interface)映射重新指向测试实现,同时保持主要配置组件扫描定义的所有其他内容。但它一直在发疯。我得到的最接近的是:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {InboxCoreApplication.class, TestConfig.class})
public class InboxServiceTest {
@Autowired
CouchbaseServiceTestImpl couchBaseServiceTestImpl;

TestConfig 在哪里:

@Configuration
public class TestConfig {
CouchbaseServiceTestImpl couchbaseServiceTestImpl = new CouchbaseServiceTestImpl();

public CouchbaseService couchbaseService() {
return couchbaseServiceTestImpl;
}
}

但是每次它要么提示重复的 bean(因为它看到两个实现),要么它注入(inject) 2 个不同的测试实现实例,一个在测试类中,一个在实际程序中(wat?)。

有什么建议吗?

最佳答案

我认为您的问题在于下课。为什么要重新实现 CouchbaseService 接口(interface)并将其作为测试版本。这样做的真正意义是什么?你应该开发单元测试类来测试你的主要源代码的功能。您正在创建该源类的测试版本并创建单元测试来测试该测试版本。这样做有什么意义?

@Repository
public class CouchbaseServiceTestImpl implements CouchbaseService {

所以更好的实现应该是,删除 CouchbaseServiceTestImpl 类。编写单元测试直接测试CouchbaseServiceImpl。 (您也可以删除 TestConfig 类)

所以代码应该是这样的

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {InboxCoreApplication.class})
public class InboxServiceTest {

@Autowired
CouchbaseServiceImpl couchbaseServiceImpl ;

提示重复 bean 背后的真正原因可以描述如下。

如果您使用@Repository、@Component 或@Service 注释任何类,Spring IOC 容器将自动实例化这些类,然后在加载Spring 应用程序上下文时在应用程序上下文中注册。

所以你有 CouchbaseService 接口(interface)的两个实现。1. CouchbaseServiceImpl2.CouchbaseServiceTestImpl

由于这两个类都已使用@Repository 注释,因此 spring 应用程序容器将实例化这两个类,并将在 IOC 容器中维护这两个对象。这两个实例都可以分配给 CouchbaseService 接口(interface)引用。

查看代码中的以下行。

  @Autowired
private CouchbaseService couchbaseService;

现在 spring 应用程序容器在寻找相关的匹配 bean(是否应该使用 CouchbaseServiceImpl 或 CouchbaseServiceTestImpl,这两个 bean 都符合分配条件)方面处于一种疑惑的状态。因此它警告重复项并且不执行分配。

你有两个选择。

选项01。

删除其中一个类中的@Repository 注释。最好在 CouchbaseServiceTestImpl 中删除它。 (最好删除那个类,正如我之前解释的那样)

选项02

根据需要保留所有类。用户 @Qualifier 告诉 spring 应用程序容器有关分配的真正匹配 bean。

所以代码应该改成如下。

@Repository("couchbaseServiceTestImpl")
public class CouchbaseServiceTestImpl implements CouchbaseService {

@Repository("couchbaseServiceImpl")
public class CouchbaseServiceImpl implements CouchbaseService {

@Repository
public class InboxObjectRepositoryImpl {

@Autowired
@Qualifier("couchbaseServiceTestImpl")
private CouchbaseService couchbaseService;

因此它将分配一个 CouchbaseServiceTestImpl 实例给 CouchbaseService 引用。

关于java - 测试中的 Spring Boot 覆盖接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38226288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com