我有一个Spring Boot服务实现,可以与三个不同的外部服务(API和SOAP Web Services)进行通信。有时这些服务可以进行维护,因此我需要实现一种机制来“绕过”或“模拟”它们。我要实现此目的的方法是在属性文件中包括一些条目:
service1.bypass.enable=true
service2.bypass.enable=true
service3.bypass.enable=true
因此在我的代码中,我只需要验证这些属性是否将值设置为true并使用正确的实现或绕过(返回模拟)。
@Value("service1.bypass.enable")
private boolean service1Bypass;
//Inside the methods
if (!service1Bypass) {
callService();
} else {
callMock();
}
在我的代码被SonarQube扫描时,这会引起一些麻烦,因为我需要测试每个服务何时被嘲笑或不嘲笑,我认为这是不相关的。您是否知道是否有解决方法或更好的编码方法?这个项目正在使用Spring和Maven以及Java 8
答案 0 :(得分:1)
我相信“绕过” 和“嘲笑” 之间存在误解。
当您绕过服务时,表示您“跳过” ,换句话说,您不会调用该服务并继续下一步。
当您“模拟” 服务时,您的逻辑不是“跳过”对该服务的调用,而是创建了一个组件(属于您的代码项目),该组件将模仿该行为。真实服务,但它将返回一些“测试”或“伪造”响应。
模拟是一种非常有用的技术,可用于测试或描述您所使用的许多服务都可以维护并影响想要使用您的服务的其他人的情况。
现在,回到问题所在,您可以通过两种方式解决此问题,第一种,如果您使用的是Jacoco Coverage插件,则只需将以下标签添加到pom.xml文件中(因为我相信您正在使用maven)。
<properties>
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.jacoco.reportPaths>target/jacoco.exec</sonar.jacoco.reportPaths>
<sonar.language>java</sonar.language>
<sonar.exclusions>YOUR PACKAGES GOES HERE</sonar.exclusions>
</properties>
除此之外,我相信您的方法还不错,但是它可能会导致一些问题,例如:
由于您已经在使用Spring,所以我认为,解决问题的一种好方法,不只是一种解决方法,而是看看Spring Profiles。
有关更详细的教程,您还可以查看:https://www.baeldung.com/spring-profiles
让我们以您的情况为例
spring.profiles.active
例如:
如果要模拟其中一项服务,则可以执行以下操作:spring.profiles.active=mockservice1
如果您要模拟两个(或更多)服务:spring.profiles.active=mockservice1,mockservice2
@Profile(“mockservice1”)
进行注释或通过@Configuration
或@Bean
注释处理的每个服务创建一个类,而不是使用条件结构。希望这可以在某种程度上帮助您解决问题。