EsfingeFramework / liveprog

Framework to allow a hot swap of classes in runtime
4 stars 4 forks source link

Testes unitários #8

Open janosimas opened 5 years ago

janosimas commented 5 years ago

Criar um conjunto de testes unitários

janosimas commented 5 years ago

@vinipaschoal Eu abri um pull request com alguns testes pra factory mas achei um comportamento estranho. Um dos testes falha, pode ver o log em https://travis-ci.org/EsfingeFramework/liveprog , e o outro não. Qual é o comportamento esperado?

O caso que não falha: Crio objetos live em modo producao, atualizo e crio em modo PRODUCAO ... Crio um objeto live em modo TESTE. verifico se o método saveLiveClass é chamado, NÃO é chamado.

caso com problema: Crio objetos live em modo TESTE, atualizo e crio em modo TESTE ... Crio um objeto live em modo PRODUCAO. verifico se o método saveLiveClass é chamado, é chamado.

vinipaschoal commented 5 years ago

Está dando erro porque você está mocando o BD. No caso que está dando erro, quando você cria um objeto em modo produção, se o BD fosse real ele voltaria a versão de producao cadastrada no banco, mas como é um mock, ele esta voltando nulo, o que está fazendo o factory chamar novamente o método saveLiveClass.

janosimas commented 5 years ago

Até aí eu entendo, mas pq um chama o metodo saveLiveClass e outro não?

vinipaschoal commented 5 years ago

Como funciona internamente os seus testes:

2) você pede para o factory atualizar a classe para a nova versão: 2.1) o factory salva a nova versão da classe no BD 2.1.1) o BD salva essa versão como uma versão de teste - nesse momento, tem-se que a versão de produção é a versão original da classe (passo 1.5.1) e a versão de teste é essa nova versão salva 2.2) o factory salva essa nova versão no cache de classes versão teste 2.3) o factory notifica os proxies e retorna

3) você pede para o factory criar um novo objeto em modo produção: 3.1) o factory procura no cache interno de classes versão produção se a classe já foi carregada 3.2) o cache de classes versão produção JÁ contém a classe (passo 1.8) 3.3) o factory cria um novo objeto da classe, cria o proxy e retorna

4) você pede para o factory criar um novo objeto em modo teste: 4.1) o factory procura no cache interno de classes versão teste se a classe já foi carregada 4.2) o cache de classes versão testes JÁ contém a classe (passo 2.2) 4.3) o factory cria um novo objeto da classe, cria o proxy e retorna

2) você pede para o factory atualizar a classe para a nova versão: 2.1) o factory salva a nova versão da classe no BD 2.1.1) o BD salva essa versão como uma versão de teste - nesse momento, tem-se que a versão de produção é a versão original da classe (passo 1.5.1) e a versão de teste é essa nova versão salva 2.2) o factory salva essa nova versão no cache de classes versão teste 2.3) o factory notifica os proxies e retorna

3) você pede para o factory criar um novo objeto em modo teste: 3.1) o factory procura no cache interno de classes versão teste se a classe já foi carregada 3.2) o cache de classes versão teste JÁ contém a classe (passo 2.2) 3.3) o factory cria um novo objeto da classe, cria o proxy e retorna

4) você pede para o factory criar um novo objeto em modo produção: 4.1) o factory procura no cache interno de classes versão produção se a classe já foi carregada 4.2) o cache de classes versão produção NÃO contém a classe 4.3) o factory procura no BD essa classe na versão produção 4.4) a classe já estaria cadastrada no BD (passo 1.5.1) e seria retornada, MAS como você está usando um mock do BD, aqui retorna null!

4.5) o que aconteceria no uso real: 4.5.1) o factory pede para o ClassLoader carregar a classe retornada do banco 4.5.2) o ClassLoader verifica que essa classe já está carregada (pois ela é a classe original, que é carregada no início da aplicação) e retorna a classe original 4.5.3) o factory guarda essa classe no cache de classes versão produção 4.5.4) o factory cria um novo objeto da classe, cria o proxy e retorna

4.6) o que está acontecendo no caso de teste: 4.6.1) a classe não está cadastrada no BD 4.6.2) o factory salva no banco essa versão da classe (aqui sinaliza o FAIL no teste!)