Departamento da Área de Informática evandro.freiberger@ifmt.edu.br
2022
Prof. Evandro César Freiberger (IFMT) Testes 2022 1 / 12
Sumário
1 Isolando Camada de Negócio da Camada de Persistência
Prof. Evandro César Freiberger (IFMT) Testes 2022 2 / 12
Isolando Camada de Negócio para Automação de Testes Unitários Quando queremos automatizar testes unitários para uma camada de negócio, precisamos isolar os testes de tal forma que o teste não atinja a camada de pesistência, tão pouco a integração com o banco de dados.
Para conseguirmos realizar os testes isolados da camada de negócio iremos "mockar"a
camada de persistência (DAOs).
Precisamos criar Object Mocks para os DAOs e ensiná-los a responder os métodos de
persitência com dados que não vão ou retornam do banco de dados.
Prof. Evandro César Freiberger (IFMT) Testes 2022 3 / 12
Isolando Camada de Negócio para Automação de Testes Unitários (1) A classe AlunoNegocio, mantém uma instância de AlunoDAO, recebida como parâmetro em seu contrutor.
A instância de AlunoDAO é usada para realizar as operações de persitência e recuperação de
informações. 1 package b r . i f m t . cba . negocio ; 2 3 import java . u t i l . L i s t ; 4 import b r . i f m t . cba . p e r s i s t e n c i a . AlunoDAO ; 5 import b r . i f m t . cba . p e r s i s t e n c i a . P e r s i s t e n c i a E x c e p t i o n ; 6 import b r . i f m t . cba . vo . AlunoVO ; 7 8 p u b l i c c l a s s AlunoNegocio { 9 10 p r i v a t e AlunoDAO alunoDAO ; 11 12 p u b l i c AlunoNegocio ( AlunoDAO alunoDAO ) throws NegocioException { 13 i f ( alunoDAO ! = n u l l ) { 14 t h i s . alunoDAO = alunoDAO ; 15 } else { 16 throw new NegocioException ( " P e r s i s t e n c i a nao i n i c i a d a " ) ; 17 } 18 } 19 20 p u b l i c v o i d i n s e r i r ( AlunoVO alunoVO ) throws NegocioException { 21 22 S t r i n g mensagemErros = t h i s . v a l i d a r D a d o s ( alunoVO ) ;
Prof. Evandro César Freiberger (IFMT) Testes 2022 4 / 12
Isolando Camada de Negócio para Automação de Testes Unitários (2) 23 24 if ( ! mensagemErros . isEmpty ( ) ) { 25 throw new NegocioException ( mensagemErros ) ; 26 } 27 28 try { 29 i f ( alunoDAO . i n c l u i r ( alunoVO ) == 0 ) { 30 throw new NegocioException ( " I n c l u s a o nao r e a l i z a d a ! ! " ) ; 31 } 32 } c a t c h ( P e r s i s t e n c i a E x c e p t i o n ex ) { 33 throw new NegocioException ( " E r r o ao i n c l u i r o aluno − " + ex . getMessage ( ) ) ; 34 } 35 } 36 37 p u b l i c v o i d a l t e r a r ( AlunoVO alunoVO ) throws NegocioException { 38 S t r i n g mensagemErros = t h i s . v a l i d a r D a d o s ( alunoVO ) ; 39 i f ( ! mensagemErros . isEmpty ( ) ) { 40 throw new NegocioException ( mensagemErros ) ; 41 } 42 43 try { 44 i f ( alunoDAO . b u s c a r P o r M a t r i c u l a ( alunoVO . g e t M a t r i c u l a ( ) ) == n u l l ) { 45 throw new NegocioException ( " Aluno nao l o c a l i z d o ! ! " ) ; 46 } 47 48 i f ( alunoDAO . a l t e r a r ( alunoVO ) == 0 ) { 49 throw new NegocioException ( " A l t e r a c a o nao r e a l i z a d a ! ! " ) ; 50 } 51 } c a t c h ( P e r s i s t e n c i a E x c e p t i o n ex ) { 52 throw new NegocioException ( " E r r o ao a l t e r a r o aluno − " + ex . getMessage ( ) ) ; 53 } 54 }
Prof. Evandro César Freiberger (IFMT) Testes 2022 5 / 12
Isolando Camada de Negócio para Automação de Testes Unitários (3) 55 56 p u b l i c v o i d e x c l u i r ( i n t m a t r i c u l a ) throws NegocioException { 57 try { 58 i f ( alunoDAO . b u s c a r P o r M a t r i c u l a ( m a t r i c u l a ) == n u l l ) { 59 throw new NegocioException ( " Aluno nao l o c a l i z d o ! ! " ) ; 60 } 61 i f ( alunoDAO . e x c l u i r ( m a t r i c u l a ) == 0 ) { 62 throw new NegocioException ( " Exclusao nao r e a l i z a d a ! ! " ) ; 63 } 64 } c a t c h ( P e r s i s t e n c i a E x c e p t i o n ex ) { 65 throw new NegocioException ( " E r r o ao e x c l u i r o aluno − " + ex . getMessage ( ) ) ; 66 } 67 } 68 69 p u b l i c L i s t <AlunoVO> pesquisaParteNome ( S t r i n g parteNome ) throws NegocioException { 70 try { 71 r e t u r n alunoDAO . buscarPorNome ( parteNome ) ; 72 } c a t c h ( P e r s i s t e n c i a E x c e p t i o n ex ) { 73 throw new NegocioException ( " E r r o ao p e s q u i s a r aluno p e l o nome − " + ex . getMessage ( ) ) ; 74 } 75 } 76 77 p u b l i c AlunoVO p e s q u i s a M a t r i c u l a ( i n t m a t r i c u l a ) throws NegocioException { 78 try { 79 r e t u r n alunoDAO . b u s c a r P o r M a t r i c u l a ( m a t r i c u l a ) ; 80 } c a t c h ( P e r s i s t e n c i a E x c e p t i o n ex ) { 81 throw new NegocioException ( " E r r o ao p e s q u i s a r aluno p e l a m a t r i c u l a − " + ex . getMessage ( ) ) ; 82 } 83 } 84 85 p r i v a t e S t r i n g v a l i d a r D a d o s ( AlunoVO alunoVO ) { 86
Prof. Evandro César Freiberger (IFMT) Testes 2022 6 / 12
Isolando Camada de Negócio para Automação de Testes Unitários (4) 87 S t r i n g mensagemErros = " " ; 88 89 i f ( alunoVO . getNome ( ) == n u l l | | alunoVO . getNome ( ) . l e n g t h ( ) == 0 ) { 90 mensagemErros += "Nome do aluno nao pode s e r v a z i o " ; 91 } 92 93 i f ( alunoVO . getNomeMae ( ) == n u l l | | alunoVO . getNomeMae ( ) . l e n g t h ( ) == 0 ) { 94 mensagemErros += " \ nNome da mae nao pode s e r v a z i o " ; 95 } 96 97 i f ( alunoVO . getNomePai ( ) == n u l l | | alunoVO . getNomePai ( ) . l e n g t h ( ) == 0 ) { 98 mensagemErros += " \ nNome do p a i nao pode s e r v a z i o " ; 99 } 100 101 i f ( alunoVO . getSexo ( ) == n u l l ) { 102 mensagemErros += " \ nSexo nao pode s e r n u l o " ; 103 } 104 105 i f ( alunoVO . getEndereco ( ) ! = n u l l ) { 106 i f ( alunoVO . getEndereco ( ) . getLogradouro ( ) == n u l l | | alunoVO . getEndereco ( ) . getLogradouro ( ) . l e n g t h ( ) == 0 ) { 107 mensagemErros += " \ nLogradouro nao pode s e r v a z i o " ; 108 } 109 110 i f ( alunoVO . getEndereco ( ) . getNumero ( ) <= 0 ) { 111 mensagemErros += " \ nNumero deve s e r maior que zero " ; 112 } 113 114 i f ( alunoVO . getEndereco ( ) . g e t B a i r r o ( ) == n u l l | | alunoVO . getEndereco ( ) . g e t B a i r r o ( ) . l e n g t h ( ) == 0 ) { 115 mensagemErros += " \ n B a i r r o nao pode s e r v a z i o " ; 116 } 117 118 i f ( alunoVO . getEndereco ( ) . getCidade ( ) == n u l l | | alunoVO . getEndereco ( ) . getCidade ( ) . l e n g t h ( ) == 0 ) {
Prof. Evandro César Freiberger (IFMT) Testes 2022 7 / 12
Isolando Camada de Negócio para Automação de Testes Unitários (5) 119 mensagemErros += " \ nCidade nao pode s e r v a z i o " ; 120 } 121 i f ( alunoVO . getEndereco ( ) . g e t U f ( ) == n u l l ) { 122 mensagemErros += " \ nUF nao pode s e r v a z i o " ; 123 } 124 } else { 125 mensagemErros += " \ nEndereco nao pode s e r v a z i o " ; 126 } 127 128 r e t u r n mensagemErros ; 129 } 130 }
Prof. Evandro César Freiberger (IFMT) Testes 2022 8 / 12
Isolando Camada de Negócio para Automação de Testes Unitários (1) 1 package b r . i f m t . cba . negocio ; 2 3 i m p o r t s t a t i c org . j u n i t . A s s e r t . f a i l ; 4 i m p o r t s t a t i c org . mockito . Mockito . mock ; 5 i m p o r t s t a t i c org . mockito . Mockito . when ; 6 7 i m p o r t org . j u n i t . Test ; 8 9 import br . ifmt . cba . p e r s i s t e n c i a . AlunoDAO ; 10 import br . ifmt . cba . p e r s i s t e n c i a . P e r s i s t e n c i a E x c e p t i o n ; 11 import br . ifmt . cba . vo . AlunoVO ; 12 import br . ifmt . cba . vo . EnderecoVO ; 13 import br . ifmt . cba . vo . EnumSexo ; 14 import br . ifmt . cba . vo . EnumUF ; 15 16 p u b l i c c l a s s AlunoNegocioTest { 17 18 @Test 19 public void testInserirDadosCorretos ( ) { 20 AlunoVO alunoVO = new AlunoVO ( ) ; 21 alunoVO . setNome ( " Aluno Teste " ) ; 22 alunoVO . setNomeMae ( "Mae do Aluno Teste " ) ; 23 alunoVO . setNomePai ( " Pai do Aluno Teste " ) ; 24 alunoVO . setSexo ( EnumSexo . MASCULINO) ; 25 alunoVO . setEndereco ( new EnderecoVO ( " Rua das F l o r e s " , 10 , 26 " Centro " , " Cuiaba " , EnumUF .MT) ) ; 27 28 try { 29 AlunoDAO alunoDAOFalso = mock ( AlunoDAO . c l a s s ) ; 30 when ( alunoDAOFalso . i n c l u i r ( alunoVO ) ) . thenReturn ( 1 ) ; 31 AlunoNegocio alunoNegocio = new AlunoNegocio ( alunoDAOFalso ) ;
Prof. Evandro César Freiberger (IFMT) Testes 2022 9 / 12
Isolando Camada de Negócio para Automação de Testes Unitários (2) 32 33 alunoNegocio . i n s e r i r ( alunoVO ) ; 34 } catch ( PersistenciaException e ) { 35 f a i l ( " E r r o ao p r e p a r a r a camada de p e r s i t e n c i a − " +e . getMessage ( ) ) ; 36 } c a t c h ( NegocioException e ) { 37 f a i l ( " Teste de I n c l u s a o f a l h o u − " +e . getMessage ( ) ) ; 38 } 39 } 40 41 @Test ( ) 42 public void testInserirDadosIncorretos ( ) { 43 AlunoVO alunoVO = new AlunoVO ( ) ; 44 alunoVO . setNome ( " " ) ; 45 alunoVO . setNomeMae ( " " ) ; 46 alunoVO . setNomePai ( " " ) ; 47 alunoVO . setSexo ( n u l l ) ; 48 alunoVO . setEndereco ( n u l l ) ; 49 50 try { 51 AlunoDAO alunoDAOFalso = mock ( AlunoDAO . c l a s s ) ; 52 when ( alunoDAOFalso . i n c l u i r ( alunoVO ) ) . thenReturn ( 1 ) ; 53 AlunoNegocio alunoNegocio = new AlunoNegocio ( alunoDAOFalso ) ; 54 55 alunoNegocio . i n s e r i r ( alunoVO ) ; 56 f a i l ( " Nao p o d e r i a chegar nessa l i n h a " ) ; 57 } catch ( PersistenciaException e ) { 58 f a i l ( " E r r o ao p r e p a r a r a camada de p e r s i t e n c i a − " +e . getMessage ( ) ) ; 59 } c a t c h ( NegocioException e ) { 60 61 } 62 } 63
Prof. Evandro César Freiberger (IFMT) Testes 2022 10 / 12
Isolando Camada de Negócio para Automação de Testes Unitários (3) 64 @Test 65 public void testAlterarDadosCorretos ( ) { 66 AlunoVO alunoVO = new AlunoVO ( ) ; 67 alunoVO . s e t M a t r i c u l a ( 1 2 3 ) ; 68 alunoVO . setNome ( " Aluno Teste " ) ; 69 alunoVO . setNomeMae ( "Mae do Aluno Teste " ) ; 70 alunoVO . setNomePai ( " Pai do Aluno Teste " ) ; 71 alunoVO . setSexo ( EnumSexo . MASCULINO) ; 72 alunoVO . setEndereco ( new EnderecoVO ( " Rua das F l o r e s " , 10 , 73 " Centro " , " Cuiaba " , EnumUF .MT) ) ; 74 75 try { 76 AlunoDAO alunoDAOFalso = mock ( AlunoDAO . c l a s s ) ; 77 when ( alunoDAOFalso . b u s c a r P o r M a t r i c u l a ( alunoVO . g e t M a t r i c u l a ( ) ) ) . thenReturn ( alunoVO ) ; 78 when ( alunoDAOFalso . a l t e r a r ( alunoVO ) ) . thenReturn ( 1 ) ; 79 AlunoNegocio alunoNegocio = new AlunoNegocio ( alunoDAOFalso ) ; 80 81 alunoNegocio . a l t e r a r ( alunoVO ) ; 82 } catch ( PersistenciaException e ) { 83 f a i l ( " E r r o ao p r e p a r a r a camada de p e r s i t e n c i a − " +e . getMessage ( ) ) ; 84 } c a t c h ( NegocioException e ) { 85 f a i l ( " Teste de A l t e r a c a o f a l h o u − " +e . getMessage ( ) ) ; 86 } 87 } 88 89 @Test 90 public void t e s t E x c l u i r ( ) { 91 AlunoVO alunoVO = new AlunoVO ( ) ; 92 alunoVO . s e t M a t r i c u l a ( 1 2 3 ) ; 93 alunoVO . setNome ( " Aluno Teste " ) ; 94 alunoVO . setNomeMae ( "Mae do Aluno Teste " ) ; 95 alunoVO . setNomePai ( " Pai do Aluno Teste " ) ;
Prof. Evandro César Freiberger (IFMT) Testes 2022 11 / 12
Isolando Camada de Negócio para Automação de Testes Unitários (4) 96 alunoVO . setSexo ( EnumSexo . MASCULINO) ; 97 alunoVO . setEndereco ( new EnderecoVO ( " Rua das F l o r e s " , 10 , 98 " Centro " , " Cuiaba " , EnumUF .MT) ) ; 99 100 try { 101 AlunoDAO alunoDAOFalso = mock ( AlunoDAO . c l a s s ) ; 102 when ( alunoDAOFalso . b u s c a r P o r M a t r i c u l a ( alunoVO . g e t M a t r i c u l a ( ) ) ) . thenReturn ( alunoVO ) ; 103 when ( alunoDAOFalso . e x c l u i r ( alunoVO . g e t M a t r i c u l a ( ) ) ) . thenReturn ( 1 ) ; 104 AlunoNegocio alunoNegocio = new AlunoNegocio ( alunoDAOFalso ) ; 105 106 alunoNegocio . e x c l u i r ( alunoVO . g e t M a t r i c u l a ( ) ) ; 107 } catch ( PersistenciaException e ) { 108 f a i l ( " E r r o ao p r e p a r a r a camada de p e r s i t e n c i a − " +e . getMessage ( ) ) ; 109 } c a t c h ( NegocioException e ) { 110 f a i l ( " Teste de Exclusao f a l h o u − " +e . getMessage ( ) ) ; 111 } 112 } 113 }
Prof. Evandro César Freiberger (IFMT) Testes 2022 12 / 12