Testes unitários com JUnit

Contratos, casos limite, JUnit e Mockito, cobertura e testes de mutação.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Escolher casos do contrato

Teste unitário verifica comportamento de uma unidade pequena; integração atravessa uma fronteira real; sistema percorre a aplicação. Arena de largura 5 aceita 0 a 4:

CasoEsperado
contem(0), contem(4)true, fronteiras interiores.
contem(-1), contem(5)false, fronteiras exteriores.
Largura 0 ou negativaIllegalArgumentException no construtor.

Esperado vem do contrato, não do código. Black-box parte o domínio em partições e fronteiras; white-box procura percursos na implementação. Largura zero é black-box quando a regra a proíbe. Estrutura: preparação, ação, asserção.

JUnit e independência

@Test
void rejeitaFronteiraSuperior() {
    assertFalse(new Limite(5).contem(5));
}
  • @ParameterizedTest com @ValueSource repete por argumento. assertEquals é igualdade lógica, assertSame identidade; em cálculos aproximados de vírgula flutuante, usa tolerância explícita adequada ao contrato e ao erro numérico. assertThrows aceita subclasses da exceção.
  • Uma instância por método, em geral. @BeforeEach/@AfterEach por execução; @BeforeAll/@AfterAll estáticos no ciclo predefinido.
  • Sem dependência de ordem, estado entre testes ou pausas arbitrárias. Tempo, aleatoriedade e I/O injetam-se para ficarem controlados.

JUnit e Mockito correm no projeto Gradle local, não no editor do site. Ficheiros completos.

Substitutos e interações

SubstitutoPapel
StubRespostas fixas, como a tecla "direita".
FakeImplementação simples funcional, como memória em vez de ficheiros.
MockVerifica interações exigidas, como mostrar(3) na vista.
SpyEnvolve o real; doReturn(...).when(spy) configura sem executar.

when(entrada.ler()).thenReturn("direita") prepara; verify(vista).mostrar(3) exige essa chamada, sem proibir outras. Se o resultado do teste já prova o comportamento, verificar o stub é normalmente redundante; verifica a interação quando faz parte do contrato, como o destino de um efeito, a sua quantidade ou a sua ordem, que as asserções não observam. Verifica efeitos externos, não cada chamada interna de um algoritmo.

Cobertura e mutação

Cobertura conta execução, não força de asserção. Para x >= 0 && x < 5: -1 nem avalia a segunda condição, 2 aceita, 5 rejeita na segunda. Linha, branches e condições perguntam coisas diferentes.

Mutação troca < por <=: só x = 5 distingue as versões; 2 e 6 não. Morto é detetado, sobrevivente passou. Sobrevivente pode ser equivalente, sem diferença observável no domínio válido: analisa antes de acrescentar testes. PIT evita, por exemplo, mutar chamadas de logging.

TDD: falha primeiro pelo requisito, implementação mínima, depois refatoração. Falha de importação não prova proteção. PBT com jqwik verifica propriedades em entradas geradas (@ForAll) com shrinking; conserva contraexemplos como regressões.

Cobertura e PIT no projeto.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.