O que fazer quando as melhores práticas de Java entram em conflito com Mockito

StackOverflow https://stackoverflow.com/questions/2052533

  •  20-09-2019
  •  | 
  •  

Pergunta

Minha equipe de desenvolvimento começou a usar Mockito e tem classes que foram definidas como 'final'. Eu li em Java eficaz de Joshua Bloch e no tópico So Quando usar o final que todas as classes devem usar o modificador final. Houve algum desacordo no tópico, mas eu concordo com a idéia de forçar a composição da classe, a menos que a herança faça sentido.

O que devo fazer quando quiser testar as aulas usando uma estrutura de teste como o Mockito que exige que as classes não tenham o modificador 'final'? Espero que alguém tenha encontrado problemas semelhantes durante o desenvolvimento. Em que resoluções sua equipe de desenvolvimento chegou?

Existem duas respostas óbvias, como usar o JMOCK ou remover o modificador 'final' nas aulas que queremos testar, mas queremos manter uma estrutura de teste externa (além da JUNIT) e pode ser difícil convencer outros desenvolvedores a remover o Modificador 'final'.

Obrigado.

Foi útil?

Solução

O que você mais precisa:

  1. A capacidade de garantir que alguém não herde de sua classe, ou
  2. A capacidade de garantir que seu código seja testável usando sua estrutura de zombaria de escolha?

Geralmente, acredito que você não precisa aplicar (1). Para mim, a testabilidade (2) é muito mais importante. O que se encaixa melhor na sua situação?

Outras dicas

Se você deseja que suas classes sejam finais, você pode implementar interfaces. As interfaces são mockable.

Como já mencionado na outra resposta, você pode fazer suas classes finais para implementar interface (s) e em seus testes zombar das interface (s).

Este é um dos benefícios de usar objetos simulados; Em cenários como esse, eles fazem você pensar em como o código pode ser melhor organizado. Se a sua base de código tiver muita referência às classes finais (assim se vinculando à implementação concreta), ele viola o princípio OO de "programação para uma interface" e a necessidade de melhor testabilidade ajudaria você a pensar em refatorar para eliminar a dependência de implementações concretas.

Este artigo sobre o uso de objetos simulados Endo-teste: testes de unidade com objetos simulados tem uma seção (4.4) intitulada Descoberta da interface Isso explica como objetos simulados ajudam a descobrir as interfaces.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top