Java SONARQUE将对模拟组件的弹簧应用条件进行严格的测试

Java SONARQUE将对模拟组件的弹簧应用条件进行严格的测试,java,spring,unit-testing,sonarqube,Java,Spring,Unit Testing,Sonarqube,我有一个Spring引导服务实现,它与三种不同的外部服务API和SOAP Web服务进行通信。有时,这些服务可以进行维护,我需要实现一种机制来“绕过”或“模拟”它们。我采用的方法是在属性文件中包含一些条目: service1.bypass.enable=true service2.bypass.enable=true service3.bypass.enable=true 因此,在我的代码中,我只需要验证这些属性的值是否设置为true,并使用正确的实现或绕过返回模拟 @Value("servi

我有一个Spring引导服务实现,它与三种不同的外部服务API和SOAP Web服务进行通信。有时,这些服务可以进行维护,我需要实现一种机制来“绕过”或“模拟”它们。我采用的方法是在属性文件中包含一些条目:

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扫描我的代码时,这造成了一些问题,因为我需要测试每个服务是否被模拟,我认为这是不相关的。你知道有没有什么解决办法或者更好的编码方法?这个项目在Java8中使用Spring和Maven,我相信在“绕过”和“模仿”之间存在误解

当您绕过某个服务时,这意味着您“跳过”了它,换句话说,您不调用该服务并继续执行下一步

当您模拟一个服务时,您的逻辑不是“跳过”对该服务的调用,而是创建一个属于您的代码项目的组件,该组件将模拟真实服务的行为,但它将返回一些“测试”或“伪”响应

模拟是一种非常有用的技术,可以用于测试,也可以用于您所描述的场景,在该场景中,您正在使用的许多服务可能会进入维护,并影响到其他想要使用您的服务的人

现在,回到您遇到的问题,您可以通过两种方法解决这个问题,第一种方法,如果您使用的是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.active 可以为该属性指定一个或多个值,并用逗号分隔。 例如: 如果要模拟其中一个服务,可以使用以下命令:spring.profiles.active=mockservice1

如果要模拟两个或多个服务:spring.profiles.active=mockservice1,mockservice2

您将不使用条件结构,而是为要使用@Profile“mockservice1”进行模拟和注释的每个服务创建一个类,或者通过@Configuration或@Bean注释进行处理。
希望这能在某种程度上帮助您解决您的问题。

非常感谢。我将检查标记是否暂时有效,然后检查配置文件内容!