Salve pessoal do GUJ!
Estou aqui tentando testar o suficiente!
Não vou mentir! Tem sido muito chato testar, alguns testes são muito repetitivos. E isso para mim é um problema enorme, com certeza estou fazendo algo de muito errado!
A repetição dos testes tem ocorrido pelo seguinte fato: Métodos públicos que chamam outros métodos públicos.
Hoje eu repito os testes com base na seguinte justificativa: Hoje eu tenhio um métodos X que chama o método Y. Os testes no método X cobre inteiramente o método Y. Se eu testo unicamente o método X e amanhã eu faço com que o método X não chame mais o método Y eu perco a cobertura no método Y! Isso também acontece em construtores que chamam outros construtores! (Um código meu onde acontece isso vou colocar no final do post)
A questão é como lidar com essa situação? Duplico prevendo a cobertura do amanhã e perco tempo hoje duplicando? Não duplico hoje e se amanhã tiver necessida eu duplico. O pior é se eu esquecer de duplicar no amanhã!
Estou tentado a não duplicar! Acho que isso segue até aquela máxima do XP “Projetar hoje para os problemas de hoje e projetar amanhã para osproblemas de amanhã”, estou quase mudando para: “Pense no hoje, hoje e deixe para pensar no amanhã, amanhã!”
Fugindo do assunto um pouco!
Exceções! Sabemos que as checadas são para os erros recuperáveis e as não checadas são para os irrecuperáveis. Mas ai vai uma dúvida por que IllegalArgumentException é não checada? Você passar um argumento ilegal para um método é irrecuperável?
De qualquer forma tenho evitado ao máximo usar execeções checadas. É muito cansativo lidar com elas. Manter a assinatura de métodos conforme exceções vão sendo adicionadas ao projeto com o evoluir do tempo e chato pacas! O que vocês acham?
Este código tem o problema dos testes! Construtores chamando outros construtores e um construtor chamando métodos sets que são públicos!
/**
* Esta classe representa um questionario.
*
* @since 1.0, 09/08/2007
* @author Bruno Hansen e Conrado Ragazzi
*/
public class Questionario implements ResultavelIF{
/**
* Titulo do questionario
*
* @since 1.0, 18/08/2007
* @author Bruno Hansen
*/
private String titulo;
/**
* Informa se o questionario esta liberado para ser respondido
*
* @since 1.0, 18/08/2007
* @author Bruno Hansen
*/
private boolean liberado;
/**
* Informa se o questionario possui resultados
*
* @since 1.0, 09/08/2007
* @author Bruno Hansen
*/
private boolean possuiResultado;
/**
* Lista de questoes do questionario
*
* @since 1.0, 10/08/2007
* @author Bruno Hansen
*/
private List<Questao> questoes;
/**
* Construtor que permite informar se o questionario esta
* liberado ou nao para ser respondido.
*
* @since 1.0, 18/08/2007
* @author Bruno Hansen
* @param _titulo Titulo do questionario
* @param _liberado Informa se o questionario esta liberado para ser respondido
* @param _questoes Lista de questoes do questionario
* @throws ObjetoNullException
* @throws TamanhoMinimoException
* @throws AssociacaoException
*/
public Questionario(String _titulo, boolean _liberado, Collection<Questao> _questoes) {
super();
setTitulo(_titulo);
setLiberado(_liberado);
setQuestoes(_questoes);
}
/**
* Construtor que permite informar se o questionario esta
* liberado ou nao para ser respondido.
*
* @since 1.0, 18/08/2007
* @author Bruno Hansen
* @param _titulo Titulo do questionario
* @param _liberado Informa se o questionario esta liberado para ser respondido
* @param _questao Questao do questionario
* @throws ObjetoNullException
* @throws AssociacaoException
*/
public Questionario(String _titulo, boolean _liberado, Questao _questao) {
this(_titulo, _liberado, criaColecaoQuestoes(_questao));
}
/**
* Construtor que nao libera o questionario para ser respondido.
*
* @since 1.0, 18/08/2007
* @author Bruno Hansen
* @param _titulo Titulo do questionario
* @param _questoes Lista de questoes do questionario
* @throws ObjetoNullException
* @throws TamanhoMinimoException
* @throws AssociacaoException
*/
public Questionario(String _titulo, Collection<Questao> _questoes) {
this(_titulo, false, _questoes);
}
/**
* Construtor que nao libera o questionario para ser respondido.
*
* @since 1.0, 18/08/2007
* @author Bruno Hansen
* @param _titulo Titulo do questionario
* @param _questao Questao do questionario
* @throws ObjetoNullException
* @throws AssociacaoException
*/
public Questionario(String _titulo, Questao _questao) {
this(_titulo, false, _questao);
}
/**
* Pega o valor do titulo.
*
* @since 1.0, 18/08/2007
* @author Bruno Hansen
* @return Valor do titulo.
*/
public String getTitulo() {
return titulo;
}
/**
* Seta o valor do titulo.
*
* @since 1.0, 18/08/2007
* @author Bruno Hansen
* @param _titulo Valor para ser setado.
* @throws ObjetoNullException
* @throws TamanhoMinimoException
*/
public void setTitulo(String _titulo) {
ObjetoVerificador.verificaNull(_titulo, "Questionario.titulo");
StringVerificador.verificaTamanhoMinimo(_titulo, "Questionario.titulo", 5);
titulo = _titulo;
}
/**
* Pega o valor do liberado.
*
* @since 1.0, 18/08/2007
* @author Bruno Hansen
* @return Valor do liberado.
*/
public boolean isLiberado() {
return liberado;
}
/**
* Seta o valor do liberado.
*
* @since 1.0, 18/08/2007
* @author Bruno Hansen
* @param _liberado Valor para ser setado.
*/
public void setLiberado(boolean _liberado) {
liberado = _liberado;
}
/**
* Seta o valor do possuiResultado.
*
* @since 1.0, 09/08/2007
* @author Bruno Hansen
* @param _possuiResultado Valor para ser setado.
*/
public void setPossuiResultado(boolean _possuiResultado) {
this.possuiResultado = _possuiResultado;
}
public boolean possuiResultado() {
return possuiResultado;
}
/**
* Pega as questoes.
*
* @since 1.0, 18/08/2007
* @author Bruno Hansen
* @return Valor do questoes.
*/
public OrdenavelIF<Questao> getQuestoes() {
OrdenadorIF<Questao> ordenadorL;
OrdenavelIF<Questao> ordenavelL;
ordenadorL = new ListOrdenadorResultavel<Questao>(questoes, this);
ordenavelL = new Ordenavel<Questao>(ordenadorL);
return ordenavelL;
}
/**
* Pega as questoes.
* (Deve ser utilizado somente pela classe Questao para gerenciar a
* associacao bidirecional entre as classes Questao e Questionario.)
*
* @since 1.0, 05/05/2007
* @author Conrado Ragazzi e Bruno Hansen
* @return Questoes.
*/
public Collection<Questao> getColecaoQuestoes() {
return questoes;
}
/**
* Adciona uma questao ao questionario
*
* @since 1.0, 18/08/2007
* @author Bruno Hansen e Conrado Ragazzi
* @param _questao A questao a ser adicionada
* @throws JaPossuiResultadoException
* @throws TamanhoMinimoException
* @throws ObjetoNullException
*/
public void adicionarQuestao(Questao _questao){
ObjetoVerificador.verificaNull(_questao, "Questionario.questao");
_questao.setQuestionario(this);
}
/**
* Remove uma questao do questionario
*
* @since 1.0, 18/08/2007
* @author Bruno Hansen e Conrado Ragazzi
* @param _questao A questao a ser removida
* @throws JaPossuiResultadoException
* @throws TamanhoMinimoException
* @throws ObjetoNullException
* @throws NaoContemObjetoException
*/
public void removerQuestao(Questao _questao){
ObjetoVerificador.verificaNull(_questao, "Questionario.questao");
ColecaoVerificador.verificaContencao(getColecaoQuestoes(), "Questionario.questoes", _questao);
_questao.setQuestionario(null);
}
/**
* Seta o valor do questoes.
*
* @since 1.0, 18/08/2007
* @author Bruno Hansen
* @param _questoes Valor para ser setado.
* @throws ObjetoNullException
* @throws TamanhoMinimoException
* @throws AssociacaoException
*/
private void setQuestoes(Collection<Questao> _questoes) {
ObjetoVerificador.verificaNull(_questoes, "Questionario.questoes");
QuestaoVerificador.verificaAssociacaoQuestionario(_questoes, "Questionario.questoes");
ColecaoVerificador.verificaTamanhoMinimo(_questoes, "Questionario.questoes", 1);
questoes = new ArrayList<Questao>();
for(Questao questaoL : _questoes)
adicionarQuestao(questaoL);
}
/**
* Metodo utilitario que cria uma colecao contendo
* a questao passada como parametro
*
* @since 1.0, 18/08/2007
* @author Bruno Hansen
* @param _questao Questao a ser adicionada na colecao
*/
private static Collection<Questao> criaColecaoQuestoes(Questao _questao) {
List<Questao> listaL;
listaL = new ArrayList<Questao>();
listaL.add(_questao);
return listaL;
}
}
Obrigado pela contribuição de todos!
[]s