jUnit: testando classe que mexem com arquivos

Testando classes que lidam com arquivos com jUnit Rules e TemporaryFolder

É quase que mandatório todo projeto Java ter uma classe FileUtils da vida para manipular arquivos… É ou não é?

public class FileUtils {

    /**
     * Lista todos os arquivos de um diretorio
     */
    public static List<File> lista(File diretorio) {
        File[] arquivos = diretorio.listFiles();
        return Arrays.asList(arquivos);
    }

    public static void deleta(File arquivo) { ... }

    public static void copia(File origem, File destino) { ... }

    public static void escreve(File arquivo, String conteudo) { ... }

    // outros métodos
}

Mas infelizmente ela não é levada tão a sério assim! No geral ela é testada manualmente“por tabela” quando testamos outra funcionalidade do sistema.

@Repository
public UsuarioDao {
    
    @Transactional
    public void deleta(Usuario usuario) {
        this.entityManager.remove(usuario);
        FileUtils.deleta(usuario.getFoto()); // deleta foto do disco
    }
}

Essa prática leva a problemas que você já deve conhecer bem, como brechas para bugs! O que fazer então? Simples, cubra a classe com testes automatizados!

Por azar nosso testar uma classe que acessa disco não é tão simples quanto um teste de unidade qualquer, por esse motivo existe alguns detalhes que você precisa saber antes de programar a 1a linha de teste (isso é muito importante!). Para entender estes detalhes, leia o novo post no blog daTriadWorks:

[Blog] Testes de Integração na prática: testando classes que manipulam arquivos com jUnit

De quebra você ainda conhece uma feature do jUnit que facilita em N vezes a escrita dos seus testes e principalmente a vida da equipe:

public class FileUtilsTest {

    @Rule
    public TemporaryFolder temp = new TemporaryFolder();

}

E aí, o que achou da dica? Aproveita e compartilha esse post com seus amigos e sua equipe – dá para tirar boas discussões daí!

2o Mau Habito Dos Desenvolvedores JSF

Método getter invocado múltiplas vezes?

Você sabia que uma simples consulta ao banco de dados colocada no método errado do seu managed bean pode tornar suas páginas 10x mais lentas?

Entre 2008 e 2014 eu palestrei em diversos lugares do Brasil sobre os 10 maus hábitos dos desenvolvedores JSF, e sem dúvida um dos problemas mais comuns que encontrei durante estas palestras conversando com profissionais, em consultorias e treinamentos foi o 2o mau hábito: colocar lógica cara em métodos getters.

Provavelmente você já caiu neste 2o mau hábito ou conhece alguém que tenha caído, de qualquer forma, podemos simplificá-lo com um simples trecho de código. Por exemplo, um problema grave pode estar num simples método getter:

public List<Produto> getProdutos() {
    return this.dao.lista(); // lista produtos do banco
}

Apesar deste método parecer inofensivo ele pode tornar sua página até 10x mais lenta para abrir no navegador! Caso duvide ou queira entender por que ele pode ser tão perigoso para sua aplicação, eu recomendo a leitura do meu novo post:

>> JSF: Não coloque processamento caro em métodos getters

Colocar consultas dentro de getters é tão perigoso que, na maioria dos casos, além de impactar diretamente na aplicação Java ele impacta no banco de dados pois este é bombardeado com inúmeras consultas.

E aí, o que achou da dica?

Deixe seu comentário, e se tiver algum amigo que curte meter consultas em getters por comodidade, eis a chance de convence-lo do contrário.

Dica de Programação 4 - StringBuilder

Dica de Programação #4 – StringBuilder

Você já precisou ler um arquivo muito grande do disco, processar linha a linha para só então guardar as linhas válidas e? Estou falando de um código como este:

File bigFile = new File("big-file.txt");
Scanner scanner = new Scanner(new FileReader(bigFile))
 .useDelimiter("\\n");

String validas = "";
while (scanner.hasNext()) {
    String linha = scanner.next();
    if (linha.contains("ok")) {
        validas += linha;
    }
}

// faz algo com as linhas validas

O código é bem simples e parece inofensivo. Mas e se eu te falar que você pode ter problemas de performance exatamente na linha que faz a concatenação de strings?

Este é o típico caso que devemos evitar a concatenação de strings com o operador + (mais) e favorer o uso da API StringBuilder do Java.  Com StringBuilder ajudamos a JVM e resolvemos o gargalo de desempenho num código tão simples quanto aquele.

Quer saber mais sobre o uso da StringBuilder? Assista nosso novo vídeo com a 4a dica de programação:

[Vídeo] Dica de Programação #4: StringBuilder

Como os demais vídeos que publicamos, este também é curtinho e tem uma dica que vai fazer você repensar antes de sair concatenando grandes strings no seu código.

E não esqueça: compartilha o vídeo com aquele seu amigo que acha que concatenar strings é inofensivo para aplicação.