Catalog
affaan-m/springboot-verification

affaan-m

springboot-verification

Verification loop for Spring Boot projects: build, static analysis, tests with coverage, security scans, and diff review before release or PR.

global
origin:ECC
New~1.4k
v1.2Saved Jul 14, 2026

Spring Boot Verification Loop

Run before PRs, after major changes, and pre-deploy.

When to Activate

  • Before opening a pull request for a Spring Boot service
  • After major refactoring or dependency upgrades
  • Pre-deployment verification for staging or production
  • Running full build → lint → test → security scan pipeline
  • Validating test coverage meets thresholds

Phase 1: Build

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

If build fails, stop and fix.

Phase 2: Static Analysis

Maven (common plugins):

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

Gradle (if configured):

./gradlew checkstyleMain pmdMain spotbugsMain

Phase 3: Tests + Coverage

mvn -T 4 test
mvn jacoco:report   # verify 80%+ coverage
# or
./gradlew test jacocoTestReport

Report:

  • Total tests, passed/failed
  • Coverage % (lines/branches)

Unit Tests

Test service logic in isolation with mocked dependencies:

@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);
  }
}

Integration Tests with Testcontainers

Test against a real database instead of 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");
  }
}

API Tests with MockMvc

Test controller layer with full Spring context:

@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());
  }
}

Phase 4: Security Scan

# Dependency CVEs
mvn org.owasp:dependency-check-maven:check
# or
./gradlew dependencyCheckAnalyze

# Secrets in source
grep -rn "password\s*=\s*\"" src/ --include="*.java" --include="*.yml" --include="*.properties"
grep -rn "sk-\|api_key\|secret" src/ --include="*.java" --include="*.yml"

# Secrets (git history)
git secrets --scan  # if configured

Common Security Findings

# Check for System.out.println (use logger instead)
grep -rn "System\.out\.print" src/main/ --include="*.java"

# Check for raw exception messages in responses
grep -rn "e\.getMessage()" src/main/ --include="*.java"

# Check for wildcard CORS
grep -rn "allowedOrigins.*\*" src/main/ --include="*.java"

Phase 5: Lint/Format (optional gate)

mvn spotless:apply   # if using Spotless plugin
./gradlew spotlessApply

Phase 6: Diff Review

git diff --stat
git diff

Checklist:

  • No debugging logs left (System.out, log.debug without guards)
  • Meaningful errors and HTTP statuses
  • Transactions and validation present where needed
  • Config changes documented

Output Template

VERIFICATION REPORT
===================
Build:     [PASS/FAIL]
Static:    [PASS/FAIL] (spotbugs/pmd/checkstyle)
Tests:     [PASS/FAIL] (X/Y passed, Z% coverage)
Security:  [PASS/FAIL] (CVE findings: N)
Diff:      [X files changed]

Overall:   [READY / NOT READY]

Issues to Fix:
1. ...
2. ...

Continuous Mode

  • Re-run phases on significant changes or every 30–60 minutes in long sessions
  • Keep a short loop: mvn -T 4 test + spotbugs for quick feedback

Remember: Fast feedback beats late surprises. Keep the gate strict—treat warnings as defects in production systems.

Files1
1 files · 1.0 KB

Select a file to preview

Overall Score

82/100

Grade

B

Good

Safety

82

Quality

83

Clarity

85

Completeness

76

Summary

A structured verification pipeline for Spring Boot projects that orchestrates build, static analysis, testing with coverage, security scanning, and diff review. The skill guides an agent through a deterministic sequence of Maven/Gradle commands and code inspections to validate code quality and security before pull requests or deployment.

Detected Capabilities

shell execution (mvn, gradlew, grep, git commands)file reading (source inspection, grep patterns)build system interaction (Maven/Gradle)test execution and coverage reportingdependency vulnerability scanning (OWASP dependency-check)git operations (diff, history inspection)pattern matching and code analysis

Trigger Keywords

Phrases that MCP clients use to match this skill to user intent.

spring boot verificationpre-commit checkssecurity scan pipelinetest coverage validationdependency vulnerability checkcode quality gaterelease verification

Risk Signals

INFO

OWASP dependency-check plugin execution for CVE scanning

Phase 4: Security Scan
INFO

Git diff and history inspection for secrets (git secrets --scan)

Phase 4: Security Scan
INFO

Grep patterns searching for hardcoded credentials (password, api_key, sk-)

Phase 4: Security Scan
INFO

Grep patterns for debugging statements and security issues (System.out.println, e.getMessage(), CORS wildcards)

Phase 4: Security Scan, Common Security Findings
INFO

Testcontainers PostgreSQL container with dynamic credentials injection

Phase 3: Tests + Coverage, Integration Tests section

Use Cases

  • Verify Spring Boot code quality before opening a pull request
  • Run comprehensive security scans to detect CVEs and hardcoded secrets
  • Validate test coverage meets organizational thresholds (80%+)
  • Execute multi-phase verification pipeline after major refactoring or dependency upgrades
  • Pre-deployment verification for staging or production releases
  • Establish consistent CI/CD gate criteria across Spring Boot services

Quality Notes

  • Skill provides concrete, copy-paste-ready bash commands for all phases (Maven and Gradle variants)
  • Includes practical code examples for unit, integration, and API tests demonstrating best practices (Mockito, Testcontainers, MockMvc)
  • Clear phase sequencing (build → analysis → test → security → diff) matches industry standard CI/CD practices
  • Output template gives agent explicit success/failure format for reporting results
  • Security checks are specific and actionable (grep patterns for credentials, System.out, CORS wildcards)
  • Continuous mode guidance acknowledges practical constraints (feedback loops, resource efficiency)
  • Limitations implicitly documented through phase ordering: earlier phases must pass before later ones are meaningful
  • Strong emphasis on test coverage thresholds and security gates ('treat warnings as defects in production systems')
  • Missing: explicit error handling guidance (what to do if static analysis plugins are not configured)
  • Missing: guidance on interpreting jacoco coverage report output or handling coverage failures
  • Missing: instructions for integrating with SonarQube or other multi-tenant analysis platforms
Model: claude-haiku-4-5-20251001Analyzed: Jul 14, 2026

Reviews

Add this skill to your library to leave a review.

No reviews yet

Be the first to share your experience.

Version History

v1.2

Content updated

2026-07-14

Latest
v1.1

Content updated

2026-04-20

v1.0

Seeded from github.com/affaan-m/everything-claude-code

2026-03-16

Use affaan-m/springboot-verification in your dev environment

Command Palette

Search for a command to run...

affaan-m/springboot-verification | SkillRepo