New to Claude Skills? Learn how to install them →

Saffaan-m on GitHub

Spring Boot Verification

Free

Automate your Spring Boot project checks before deployment.

by affaan-m239.3k stars on affaan-m/ecc
1 views
Updated Aug 10, 2026
Get this skill

Free · Opens the source repo

What Spring Boot Verification does

The Spring Boot Verification skill provides a comprehensive verification loop designed specifically for Spring Boot projects. It ensures that your code is thoroughly checked before merging pull requests, after significant changes, and prior to deployment. This skill automates multiple stages of the verification process, including building the project, performing static analysis, running tests with coverage checks, conducting security scans, and reviewing code diffs. By integrating these checks into your workflow, you can maintain high code quality and security standards throughout your development process.

The verification loop is structured into several phases. It begins with the build phase, where either Maven or Gradle commands are executed to compile the project. If the build fails, the process stops, prompting developers to address the issues immediately. Next, static analysis is performed using tools like Spotbugs, PMD, and Checkstyle to catch potential code quality issues early. This is followed by running unit tests and generating coverage reports to ensure that the code meets predefined coverage thresholds.

In addition to testing, the skill includes a security scanning phase that checks for known vulnerabilities in dependencies and searches for hardcoded secrets in the codebase. Finally, the verification loop concludes with a diff review to ensure that no unwanted changes have been introduced. The output report summarizes the results of each phase, allowing developers to quickly assess the readiness of their code for production.

This skill is particularly useful for teams working on Spring Boot applications who want to enforce a rigorous verification process before code changes are integrated into the main branch or deployed to production. By automating these checks, developers can focus on writing code while ensuring that quality and security are not compromised.

When to use it

Use this skill before opening pull requests, after major refactoring, and prior to deploying applications to staging or production environments.

When not to use it

This skill may not be suitable for projects that do not use Spring Boot or for teams that prefer a more manual verification process.

What you can build with it

Pre-Pull Request Checks

Run the verification loop before opening a pull request to ensure code quality and security.

Post-Refactoring Validation

Use the skill after significant code changes to validate that everything still works as expected.

Deployment Readiness

Execute the verification loop before deploying to staging or production to catch any issues early.

How to install Spring Boot Verification

View source

1. Install with the skills CLI

npx skills add affaan-m/ecc/springboot-verification --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by affaan-m

Bucle de Verificación Spring Boot

Ejecutar antes de PRs, después de cambios importantes y antes del despliegue.

Cuándo Activar

  • Antes de abrir un pull request para un servicio Spring Boot
  • Después de refactorizaciones importantes o actualizaciones de dependencias
  • Verificación previa al despliegue para staging o producción
  • Ejecutar el pipeline completo de build → lint → test → escaneo de seguridad
  • Validar que la cobertura de pruebas cumpla los umbrales

Fase 1: Build

mvn -T 4 clean verify -DskipTests
# o
./gradlew clean assemble -x test

Si el build falla, detener y corregir.

Fase 2: Análisis Estático

Maven (plugins comunes):

mvn -T 4 spotbugs:check pmd:check checkstyle:check

Gradle (si está configurado):

./gradlew checkstyleMain pmdMain spotbugsMain

Fase 3: Pruebas + Cobertura

mvn -T 4 test
mvn jacoco:report   # verificar cobertura 80%+
# o
./gradlew test jacocoTestReport

Reporte:

  • Total de pruebas, pasadas/fallidas
  • % de cobertura (líneas/ramas)

Pruebas Unitarias

Probar la lógica del servicio en aislamiento con dependencias mockeadas:

@ExtendWith(MockitoExtension.class)
class UserServiceTest {

  @Mock private UserRepository userRepository;
  @InjectMocks private UserService userService;

  @Test
  void createUser_validInput_returnsUser() {
    var dto = new CreateUserDto("Alice", "alice@example.com");
    var expected = new User(1L, "Alice", "alice@example.com");
    when(userRepository.save(any(User.class))).thenReturn(expected);

    var result = userService.create(dto);

    assertThat(result.name()).isEqualTo("Alice");
    verify(userRepository).save(any(User.class));
  }

  @Test
  void createUser_duplicateEmail_throwsException() {
    var dto = new CreateUserDto("Alice", "existing@example.com");
    when(userRepository.existsByEmail(dto.email())).thenReturn(true);

    assertThatThrownBy(() -> userService.create(dto))
        .isInstanceOf(DuplicateEmailException.class);
  }
}

Pruebas de Integración con Testcontainers

Probar contra una base de datos real en lugar de H2:

@SpringBootTest
@Testcontainers
class UserRepositoryIntegrationTest {

  @Container
  static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine")
      .withDatabaseName("testdb");

  @DynamicPropertySource
  static void configureProperties(DynamicPropertyRegistry registry) {
    registry.add("spring.datasource.url", postgres::getJdbcUrl);
    registry.add("spring.datasource.username", postgres::getUsername);
    registry.add("spring.datasource.password", postgres::getPassword);
  }

  @Autowired private UserRepository userRepository;

  @Test
  void findByEmail_existingUser_returnsUser() {
    userRepository.save(new User("Alice", "alice@example.com"));

    var found = userRepository.findByEmail("alice@example.com");

    assertThat(found).isPresent();
    assertThat(found.get().getName()).isEqualTo("Alice");
  }
}

Pruebas de API con MockMvc

Probar la capa controller con el contexto completo de Spring:

@WebMvcTest(UserController.class)
class UserControllerTest {

  @Autowired private MockMvc mockMvc;
  @MockBean private UserService userService;

  @Test
  void createUser_validInput_returns201() throws Exception {
    var user = new UserDto(1L, "Alice", "alice@example.com");
    when(userService.create(any())).thenReturn(user);

    mockMvc.perform(post("/api/users")
            .contentType(MediaType.APPLICATION_JSON)
            .content("""
                {"name": "Alice", "email": "alice@example.com"}
                """))
        .andExpect(status().isCreated())
        .andExpect(jsonPath("$.name").value("Alice"));
  }

  @Test
  void createUser_invalidEmail_returns400() throws Exception {
    mockMvc.perform(post("/api/users")
            .contentType(MediaType.APPLICATION_JSON)
            .content("""
                {"name": "Alice", "email": "not-an-email"}
                """))
        .andExpect(status().isBadRequest());
  }
}

Fase 4: Escaneo de Seguridad

# CVEs de dependencias
mvn org.owasp:dependency-check-maven:check
# o
./gradlew dependencyCheckAnalyze

# Secretos en código fuente
grep -rn "password\s*=\s*\"" src/ --include="*.java" --include="*.yml" --include="*.properties"
grep -rn "sk-\|api_key\|secret" src/ --include="*.java" --include="*.yml"

# Secretos (historial de git)
git secrets --scan  # si está configurado

Hallazgos Comunes de Seguridad

# Verificar System.out.println (usar logger en su lugar)
grep -rn "System\.out\.print" src/main/ --include="*.java"

# Verificar mensajes de excepción en bruto en respuestas
grep -rn "e\.getMessage()" src/main/ --include="*.java"

# Verificar CORS comodín
grep -rn "allowedOrigins.*\*" src/main/ --include="*.java"

Fase 5: Lint/Formato (compuerta opcional)

mvn spotless:apply   # si se usa el plugin Spotless
./gradlew spotlessApply

Fase 6: Revisión de Diff

git diff --stat
git diff

Lista de verificación:

  • Sin logs de depuración residuales (System.out, log.debug sin guardias)
  • Errores y códigos HTTP con significado
  • Transacciones y validación presentes donde se necesitan
  • Cambios de configuración documentados

Plantilla de Salida

REPORTE DE VERIFICACIÓN
=======================
Build:      [PASS/FAIL]
Estático:   [PASS/FAIL] (spotbugs/pmd/checkstyle)
Pruebas:    [PASS/FAIL] (X/Y pasadas, Z% cobertura)
Seguridad:  [PASS/FAIL] (hallazgos CVE: N)
Diff:       [X archivos modificados]

General:    [LISTO / NO LISTO]

Problemas a Corregir:
1. ...
2. ...

Modo Continuo

  • Volver a ejecutar las fases ante cambios significativos o cada 30–60 minutos en sesiones largas
  • Mantener un bucle corto: mvn -T 4 test + spotbugs para retroalimentación rápida

Recuerda: La retroalimentación rápida supera las sorpresas tardías. Mantener la compuerta estricta — tratar las advertencias como defectos en sistemas de producción.

Frequently asked questions about Spring Boot Verification

Similar skills