O Gerador De CPF O Gerador De CPF

Gerar CPF em Java: Função com Testes JUnit 5

Em muitos projetos Java, gerar CPF válido diretamente no código é necessário para popular fixtures, alimentar testes de integração e simular cenários em ambientes de homologação. A classe abaixo aplica o algoritmo de módulo 11 sobre nove dígitos aleatórios, encapsulando a lógica em um método estático pronto para uso com validador auxiliar.

Código

import java.util.Random;

public class CPFGenerator {

    private static final Random random = new Random();

    public static String generate() {
        int[] digits = new int[11];

        for (int i = 0; i < 9; i++) {
            digits[i] = random.nextInt(10);
        }

        // Primeiro dígito verificador
        int sum = 0;
        for (int i = 0; i < 9; i++) {
            sum += digits[i] * (10 - i);
        }
        int r = sum % 11;
        digits[9] = r < 2 ? 0 : 11 - r;

        // Segundo dígito verificador
        sum = 0;
        for (int i = 0; i < 10; i++) {
            sum += digits[i] * (11 - i);
        }
        r = sum % 11;
        digits[10] = r < 2 ? 0 : 11 - r;

        StringBuilder sb = new StringBuilder(11);
        for (int d : digits) {
            sb.append(d);
        }
        return sb.toString();
    }

    public static boolean validate(String cpf) {
        String cleaned = cpf.replaceAll("[^\\d]", "");

        if (cleaned.length() != 11) {
            return false;
        }

        // Rejeita CPFs com todos os dígitos iguais
        if (cleaned.chars().distinct().count() == 1) {
            return false;
        }

        int[] digits = new int[11];
        for (int i = 0; i < 11; i++) {
            digits[i] = cleaned.charAt(i) - '0';
        }

        // Verifica primeiro dígito
        int sum = 0;
        for (int i = 0; i < 9; i++) {
            sum += digits[i] * (10 - i);
        }
        int r = sum % 11;
        int expected = r < 2 ? 0 : 11 - r;
        if (digits[9] != expected) {
            return false;
        }

        // Verifica segundo dígito
        sum = 0;
        for (int i = 0; i < 10; i++) {
            sum += digits[i] * (11 - i);
        }
        r = sum % 11;
        expected = r < 2 ? 0 : 11 - r;
        return digits[10] == expected;
    }
}

Análise do código

O método generate() começa criando um array de 11 posições e preenchendo as nove primeiras com dígitos aleatórios obtidos via random.nextInt(10). Em seguida, aplica a fórmula do módulo 11 duas vezes: a primeira iteração percorre os nove dígitos base com pesos de 10 a 2 para obter o primeiro verificador, e a segunda percorre os dez dígitos (incluindo o verificador recém-calculado) com pesos de 11 a 2 para obter o segundo.

O método validate() funciona como espelho do gerador. Ele limpa a string de entrada removendo qualquer caractere não numérico, verifica se o resultado tem exatamente 11 dígitos e rejeita sequências onde todos os dígitos são iguais (como 11111111111), que passariam na conta matemática mas não são CPFs válidos. Depois recalcula os dois verificadores e os compara com os dígitos fornecidos.

A escolha de um int[] para armazenar os dígitos evita conversões repetidas entre char e int, mantendo o código legível e eficiente. O StringBuilder com capacidade pré-definida de 11 garante que a montagem da string final não exija realocações de buffer. A instância de Random é declarada como campo estático para ser reutilizada entre chamadas sucessivas.

Uso

public class Main {
    public static void main(String[] args) {
        String cpf = CPFGenerator.generate();
        System.out.println("CPF gerado: " + cpf);
        System.out.println("Válido: " + CPFGenerator.validate(cpf));
    }
}

Testes

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class CPFGeneratorTest {

    @Test
    void geradoDeveTer11Digitos() {
        String cpf = CPFGenerator.generate();
        assertEquals(11, cpf.length());
        assertTrue(cpf.matches("\\d{11}"));
    }

    @Test
    void geradoDeveSerValido() {
        String cpf = CPFGenerator.generate();
        assertTrue(CPFGenerator.validate(cpf));
    }

    @Test
    void multiplosGeradosDevemDiferir() {
        String cpf1 = CPFGenerator.generate();
        String cpf2 = CPFGenerator.generate();
        String cpf3 = CPFGenerator.generate();
        assertFalse(cpf1.equals(cpf2) && cpf2.equals(cpf3),
                "Três CPFs gerados consecutivamente não devem ser todos iguais");
    }
}

O primeiro teste garante que o CPF tem exatamente 11 caracteres numéricos. O segundo confirma que o CPF gerado é reconhecido como válido pelo próprio validador. O terceiro gera três CPFs e verifica que não são todos idênticos, o que confirmaria uma falha na aleatoriedade.


Veja também como validar CPF em Java com exemplos detalhados, ou volte à página inicial para gerar CPFs online.