Java 如何使用Spring概要文件模拟实现相同接口的不同服务

Java 如何使用Spring概要文件模拟实现相同接口的不同服务,java,spring,spring-boot,mocking,spring-profiles,Java,Spring,Spring Boot,Mocking,Spring Profiles,我有以下情况: 我有一个Springboot微服务,它可以收集来自不同提供商(外部SOAP web服务)的产品列表。目前,我们从亚马逊和易趣等两家供应商处获取信息 但在未来,我可以有更多的提供商,因此我的应用程序需要具有可扩展性 此外,我可以从Amazon或Ebay收集信息,也可以从这两种服务获取信息,如果提供商列表增加,例如,我可以添加AliExpress,我应该能够选择Amazon+AliExpress或Ebay+AliExpress或其中三种 我创建了一个界面: public interf

我有以下情况:

我有一个Springboot微服务,它可以收集来自不同提供商(外部SOAP web服务)的产品列表。目前,我们从亚马逊和易趣等两家供应商处获取信息

但在未来,我可以有更多的提供商,因此我的应用程序需要具有可扩展性

此外,我可以从Amazon或Ebay收集信息,也可以从这两种服务获取信息,如果提供商列表增加,例如,我可以添加AliExpress,我应该能够选择Amazon+AliExpress或Ebay+AliExpress或其中三种

我创建了一个界面:

public interface ProductsService {
   List<Product> getProducts();
}
public class AmazonProductsService implements ProductService {
   public List<Product> getProducts() {
      // Logic to call SOAP Web Service for Amazon Products
   }
}

public class EbayProductsService implements ProductService {
   public List<Product> getProducts() {
      // Logic to call SOAP Web Service for Ebay Products
   }
}
我也为易趣服务做了同样的事情(个人资料是“mockebay”)

我的问题是,在设置概要文件时,如何调用模拟服务,例如:

spring.profiles.active=mockamazon
在模拟考试之前,我上过以下课程:

@Service
public class ProductsServiceFactory {
   @Autowired
   @Qualifier("AmazonProductsService")
   private ProductsService amazonProductsService;

   @Autowired
   @Qualifier("EbayProductsService")
   private ProductsService ebayProductsService;

   public List<ProductsService> getProductsService(String selectedServicesParameter) {
      String[] selectedServices = selectedServicesParameter.split(",");        
      List<ProductsService> servicesList = new ArrayList<>();

      for (String selectedService : selectedServices) {
          if (selectedService.equals("AMAZON") {
             servicesList.add(amazonProductsService);
          } else if (selectedService.equals("EBAY") {
             servicesList.add(ebayProductsService);
          }
      }
      return servicesList;
   }
}
@服务
公共类产品服务工厂{
@自动连线
@限定词(“AmazonProductsService”)
私人产品服务亚马逊产品服务;
@自动连线
@限定符(“EbayProductsService”)
私人产品服务ebayproducts服务;
公共列表getProductsService(字符串选择的服务参数){
字符串[]selectedServices=selectedServicesParameter.split(“,”);
列表服务列表=新的ArrayList();
for(字符串selectedService:selectedServices){
if(selectedService.equals(“亚马逊”){
服务列表添加(amazonProductsService);
}else if(selectedService.equals(“易趣”){
服务列表添加(ebayProductsService);
}
}
返回服务列表;
}
}
但现在,我不确定如何调用模拟服务。我曾想过为模拟服务创建一个额外的服务工厂,但我可能需要只模拟一个服务,而不是所有服务


任何建议都将不胜感激。

我不能说我的解决方案是完美的,但它确实有效

您可以为每个案例创建配置文件,并进行如下配置:

@Configuration
public class MockServiceAutoconfiguration {

   @Profile({"mockAmazon", "mockAll", "mockAmazonAndEbay"})
   @Bean
   public ProductsService amazonProductsService() {
      return new MockAmazonProductsService();
   }

   @Profile({"mockAliexpress", "mockAll"})
   @Bean
   public ProductsService aliexpressProductsService() {
      return new MockAliexpressProductsService();
   }

}

谢谢你的回答,让我试一试,到目前为止,我知道我应该为我的“官方”服务提供商创建ProductServiceAutoconfiguration,对吗?该配置不应该使用配置文件,而应该只使用“bean”。在这种情况下应该如何进行调用?经过一段时间的努力,我将把答案标记为一个可接受的解决方案。在迁移到不同的内部构建框架后,团队成功地实现了我们想要的。非常感谢!
@Service
public class ProductsServiceFactory {
   @Autowired
   @Qualifier("AmazonProductsService")
   private ProductsService amazonProductsService;

   @Autowired
   @Qualifier("EbayProductsService")
   private ProductsService ebayProductsService;

   public List<ProductsService> getProductsService(String selectedServicesParameter) {
      String[] selectedServices = selectedServicesParameter.split(",");        
      List<ProductsService> servicesList = new ArrayList<>();

      for (String selectedService : selectedServices) {
          if (selectedService.equals("AMAZON") {
             servicesList.add(amazonProductsService);
          } else if (selectedService.equals("EBAY") {
             servicesList.add(ebayProductsService);
          }
      }
      return servicesList;
   }
}
@Configuration
public class MockServiceAutoconfiguration {

   @Profile({"mockAmazon", "mockAll", "mockAmazonAndEbay"})
   @Bean
   public ProductsService amazonProductsService() {
      return new MockAmazonProductsService();
   }

   @Profile({"mockAliexpress", "mockAll"})
   @Bean
   public ProductsService aliexpressProductsService() {
      return new MockAliexpressProductsService();
   }

}