SonarQube要求对具有模拟组件的Spring应用程序的条件进行测试

时间:2018-08-14 21:20:11

标签: java spring unit-testing sonarqube

我有一个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

1 个答案:

答案 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>

除此之外,我相信您的方法还不错,但是它可能会导致一些问题,例如:

  • 您正在将自己的“模拟”逻辑混入业务逻辑中,这可能有点混乱。
  • 使用诸如SonarQube(静态分析)之类的工具分析代码时,您会发现每个条件通常都需要一个测试用例(我相信这是您遇到的问题)
  • 您现在使用三个属性是因为您连接到三个服务,但是如果需要使用八个或九个服务怎么办?您将添加八或九个属性吗?我的意思是,您可以,但是有点麻烦,恕我直言。

由于您已经在使用Spring,所以我认为,解决问题的一种好方法,不只是一种解决方法,而是看看Spring Profiles

有关更详细的教程,您还可以查看:https://www.baeldung.com/spring-profiles

让我们以您的情况为例

  1. 您只需定义一个属性,而不是为属性文件中的每个服务定义一个属性,该属性称为:spring.profiles.active
  2. 您可以为该属性分配一个或多个值(以逗号分隔)。

例如: 如果要模拟其中一项服务,则可以执行以下操作:spring.profiles.active=mockservice1

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

  1. 您将为要模拟和使用@Profile(“mockservice1”)进行注释或通过@Configuration@Bean注释处理的每个服务创建一个类,而不是使用条件结构。

希望这可以在某种程度上帮助您解决问题。