Você está na página 1de 165

Curso de Java bsico para Iniciantes Usando Eclipse

1. O que o curso? 2. O que Java e como funciona? 3. Instalando e Aprontando o Java 4. Instalando e Aprontando o Eclipse 5. Classe Pessoa (atributos e construtor) 6. Classe Pessoa (mtodos get e set) 7. Usando o Scrapbook do Eclipse 8. JUnit no Eclipse - parte 1 9. JUnit no Eclipse - parte 2 10. "Test-First Development" no Eclipse 11. Classe Livro 12. Adicionando Pessoa Classe Livro 13. Listas e ArrayList 14. Iniciando a Classe Biblioteca 15. Criando os primeiros mtodos na Classe Biblioteca 16. Criando os mtodos de Emprstimo e Devoluo 17. Evoluindo os mtodos de Emprstimo e Devoluo 18. Finalizando a Classe Biblioteca 19. Criando o mtodo main e o arquivo JAR O que o curso?

Caractersticas
O Curso Java para iniciantes (usando Eclipse) para voc que est se iniciando no mercado e precisa aprender Java de uma forma rpida e objetiva. Para iniciar o curso, voc precisa saber lgica de programao, pois no ensinamos isso aqui. No mais, simplesmente querer aprender e gostar de pesquisar. Este curso no tem durao pr-determinada. Voc define o seu ritmo e em consequncia a durao do curso. O material est todo disponvel aqui nestas pginas, portanto basta seguir os links e as instrues. O material, como diz o ttulo, destinado a iniciantes, ensinamos o bsico para que voc fique confortvel ao prosseguir nos estudos mais avanados. Para incentivar a interatividade, foi criada uma lista de discusso. Os estudantes interessados, podem se inscrever e trocar informaes entre si e com instrutores voluntrios (assim que estes estiverem disponveis).

Por que Java com Eclipse?


Existem muitas razes para se aprender a programar em Java. Mas por que usando Eplipse?

No existem dados estatsticos sobre isso, mas na prtica, podemos considerar o Eclipse e suas variaes,como sendo a IDE padro de mercado para Java. Portanto, aprendendo a usar esta IDE, voc j vai se preparando para um prximo ingresso no mercado de trabalho. Seguem algumas das caractersticas do Eclipse que o tornaram um sucesso de mercado:

O Eclipse prov uma srie de facilidades que permitem escrever programas Java de forma muito mais rpida e simples do que usando um editor de texto comum. Isso significa que voc pode usar mais do seu tempo aprendendo Java do que digitando e olhando a documentao. O debugger e o scrapbook permitem olhar "dentro" de um programa Java em execuo. Isso permite que voc "veja" os objetos e entenda como o Java funciona "por trs dos panos". O Eclipse prov suporte total para as prticas de desenvolvimento gil, tais como: TDD (test-driven development) e refatorao. Isso permite que voc aprenda estas tcnicas enquanto aprende Java. Alm de tudo isso, existem plugins que permitem disponibilizar facilidades ainda mais especficas que facilitam o desenvolvimento para plataformas diversas.

Assuntos abordados no Curso


O Bsico do Eclipse para desenvolvimento de aplicaes Java. O Bsico do Java e Programao Orientada a Objetos. O Bsico do TDD (Test-driven development) e testes unitrios no Eclipse.

Origens do Curso
No, esta no uma ideia original. Este curso foi baseado no trabalho original de Mark Dexter datada de 2007, chamada "Eclipse and Java for Total Beginners", disponvel aqui. Em 2008, o Ronaldo Caldas fez uma traduo dos screencasts para Portugus. Eles podem ser encontrados aqui. A questo que screencasts so mais difceis de produzir e manter atualizados. Minha inteno com esta verso Web do curso composta por pginas estticas em Portugus, seja mais fcil de incrementar e manter atualizada no futuro. Espero que vocs gostem do curso e tirem proveito dele. Tudo de bom! MarcRic

Viso geral de Java

Histria

Tudo comeou em Dezembro de 1990. O engenheiro Patrick Naughton, da Sun Microsystems, estava insatisfeito com as ferramentas e APIs do C++ da Sun, estando disposto a passar a usar a plataforma Next, a Sun ofereceu a ele a chance de trabalhar numa nova tecnologia, tendo incio assim, o projeto "Stealth".

Em 1991, o projeto foi renomeado para "Green", tendo James Gosling e Mike Sheridan se juntado a Patrick e junto com outros engenheiros da Sun iniciaram os trabalhos. O objetivo deste projeto, era antecipar a "prxima onda" tecnolgica do mundo digital. Eles acreditavam que em breve os equipamentos e eletrodomsticos de uso dirio estariam interagindo mais e mais com os usurios, e para dar suporte a isso precisava ser criada uma plataforma de desenvolvimento inteiramente nova, e principalmente: orientada a objetos. Para implementar esta nova plataforma, eles precisavam de uma linguagem de programao que atendesse a dois principais requisitos: ser compacta e ser confivel. Bill Joy, um dos fundadores da Sun, j havia proposto uma nova linguagem de programao, combinando as linguagens "Mesa" e "C", e chegou a sugerir que os engenheiros da Sun produzissem um ambiente orientado a objetos, baseado no C++. Gosling, tentou modificar e estender o C++, mas acabou abandonando a ideia, em favor de uma linguagem inteiramente nova. Esta linguagem foi inicialmente batizada de Oak, que quer dizer carvalho, em aluso a uma rvore que Gosling podia observar quando olhava pela janela do seu escritrio.

Durante meses, 16 pessoas trabalharam num escritrio de Sand Hill Road, no Menlo Park, num prottipo para demonstrar a ideia na prtica, e em Setembro de 1992, eles estavam prontos para demonstrar partes desta nova plataforma, incluindo o sistema operacional "Green", a linguagem Oak, as bibliotecas e o hardware. O prottipo se chamava *7 (leia-se "StarSeven"), um controle remoto com uma interface grfica touchscreen para Televises interativas.

A interface grfica possua um sistema de ajuda interativa apresentado por um personagem virtual, um mascote criado por Joe Palrang que hoje amplamente conhecido no mundo Java, o Duke. O *7 tinha a habilidade de controlar diversos dispositivos e aplicaes. Tudo isso foi criado usando a linguagem Oak. Infelizmente, apesar de todos os esforos, esta tecnologia acabou se mostrando muito avanada para a indstria de TV a cabo daquela poca. Por outro lado, a internet vinha se desenvolvendo paralelamente num ritmo muito acelerado. No incio de Julho de 1994, depois de trs dias de brainstorming com John Gage, diretor de cincia da Sun, Gosling, Joy, Naughton, Wayne Rosing, e Eric Schmidt, resolveram redirecionar o projeto para a internet, ficando Gosling incumbido de liderar o projeto. Eles vislumbraram que com o advento de navegadores com capacidade grfica como o Mosaic, a internet estava no caminho para evoluir no mesmo caminho de mdia altamente interativo que eles haviam proposto para a industria de TV a cabo. A ttulo de prottipo, Naughton escreveu um pequeno navegador chamado WebRunner (devido ao filme Blade Runner), mais tarde renomeado para HotJava.

A primeira demonstrao pblica do WebRunner foi feita por John Gage e James Gosling no evento "Technology Entertainment Design Conference" em Monterey, California no incio de 1995. Este evento pode ser considerado um marco, pois no havia nada de muito interessante numa nova linguagem apresentando uma pgina contendo um texto e imagens num clone do Mosaic. A apresentao se arrastava sem chamar a ateno da audincia. Porm dois demos fizeram a audincia vibrar: Num deles, Gosling moveu o mouse sobre a imagem 3D de uma molcula fazendo com que ela se movesse nos 3 eixos, conquistada a ateno da plateia, Gosling foi alm, apresentando um algoritmo animado de ordenao onde trs conjuntos de linhas horizontais de tamanhos randmicos eram ordenados da menor para a maior simplesmente movendo as linhas para cima e para baixo. A plateia nunca tinha visto nada alm de imagens estticas num navegador. Aquilo era realmente revolucionrio! Mais tarde, no incio de 1995, a linguagem foi rebatizada para Java, depois que uma pesquisa de patentes revelou que o nome Oak havia sido registrado pela empresa Oak Technology. A primeira verso pblica do Java foi anunciada em Maio de 1995 no evento "SunWord". Era o Java 1.0a2 com o navegador HotJava.

No mesmo evento a Netscape anunciou que os seus navegadores iriam incluir suporte a Java. Em Janeiro de 1996 a Sun criou o grupo JavaSoft para desenvolver a tecnologia Java. Nesta nova verso da linguagem, Gosling, procurou implementar uma mquina virtual e uma linguagem usando notaes semelhantes a linguagem C/C++. Com a promessa de se escrever uma vez e executar em qualquer lugar - "Write Once, Run Anywhere" (WORA) - gerando executveis sem custo para as plataformas mais populares. Rapidamente, a maioria dos navegadores Web incorporaram a habilidade de executar applets Java nas pginas Web, fazendo com que Java se tornasse popular ainda mais rpido. Com o advento do Java 2 (lanado inicialmente como J2SE 1.2 no incio de 1999), verses diferentes e customizadas comearam a surgir (J2EE, J2ME), em 2006 por questes de marketing a Sun renomeou as verses mais novas de J2 para: Java EE, Java ME e Java SE respectivamente.

Em novembro de 2006, a Sun comeou a liberar a maior parte do Java como software de cdigo aberto "open source", sob os termos da licena pblica GNU. Este processo terminou em Maio de 2007, tendo ficado toda a parte essencial do Java disponvel nos termos de software livre e cdigo aberto, exceto uma pequena parte sobre a qual a Sun no detm o copyright.

Logo aps a aquisio da Sun pela Oracle em 2010, a Oracle se auto proclamou como sendo a "Guardi da tecnologia Java" com um compromisso incansvel de promover uma comunidade participativa e transparente.

Caractersticas
A linguagem Java, apenas um dos componentes da plataforma Java. O termo "Java" na verdade se refere a um grupo de produtos e especificaes da Sun Microsystems, atualmente uma subsidiria da Oracle, que juntos constituem uma plataforma de desenvolvimento de software e que permitem a instalao e uso destes softwares em vrios ambientes (Sistemas Operacionais e Hardwares) diferentes.

Java usado num espectro muito amplo de plataformas: desde dispositivos dedicados e telefones celulares, passando por computadores pessoais, indo at servidores Web e Aplicaes Corporativas. A Linguagem Java, uma mistura de muitas outras, tais como: C, C++, LISP, Objective-C, MESA, Modula3, entre outras. Sintaticamente, ela se assemelha muito a C e C++, porm muito mais simples que estas, devido ao fato de ser fortemente tipada. Abaixo, citamos algumas outras caractersticas da linguagem Java que seus desenvolvedores buscavam quando do seu desenvolvimento.

Simples Portvel Orientada a Objetos Interpretada Distribuda Alta Performance Robusta Multi Tarefa Segura Dinmica De Arquitetura Neutra

Como Funciona?
A execuo de um programa java se d em trs aes distintas: 1. Crie um programa fonte em Java. Um programa fonte, contm texto escrito na linguagem de programao Java. Um programa Java, pode ser entendido por voc e outros programadores. Qualquer editor de texto pode ser usado para criar e editar programas fonte. 2. Compile o programa fonte em um arquivo "bytecode". O compilador Java "javac"", traduz o seu programa fonte em instrues que a Mquina Virtual Java (JVM)) pode entender. O compilador armazena estas instrues num arquivo "bytecode". 3. Execute o programa contido no arquivo "bytecode". A Mquina Virtual Java, implementa o interpretador Java "java", Este interpretador, processa o arquivo "bytecode" gerando instrues equivalentes de forma que a plataforma em uso (Sistema Operacional e Hardware) consiga entender e executar estas instrues.

Instalando e Aprontando o Java


Primeiros passos:

Em primeiro lugar precisamos ter disponvel a plataforma de desenvolvimento Java. Para tal, devemos acessar o site da Oracle que disponibiliza as vrias opes para Download aqui. No caso de desenvolvimento em Java, o recomendado o JDK Se voc no tiver problemas de espao nem de performance, opte pelo Java EE que o que se encontra em ambientes corporativos. Se tiver algum tipo de limitao, opte pelo Java puro, que menor e mais simples.

Instalando o Java 7

Vamos escolher o Java EE, e na pgina seguinte escolher aquele apropriado para a nossa plataforma de trabalho.

Marcar o boto de aceite do acordo de licena. E efetuar o download.

O processo de instalao bem simples, mas se precisar de detalhes, acesse aqui. Agora voc tem no s o JDK instalado, como tambm o GlassFish, um "Servidor de Aplicaes" compatvel com Java EE 6. O prximo passo, verificar se a instalao est correta. No meu caso, como j havia uma verso anterior de JDK instalada, o uso do comando "set java", permite verificar para onde a varivel de ambiente "JAVA_HOME" aponta.

Aps a instalao, devemos portanto, atualizar (ou criar se voc nunca tiver instalado um JDK antes) a varivel de ambiente "JAVA_HOME".

Uma forma simples de testar se est tudo certo com a instalao, tentar obter a verso do compilador Java disponvel com o comando "javac -version".

Tudo certo? Ento podemos prosseguir...

Instalando e Aprontando o Eclipse

O que o Eclipse?

O Eclipse na verdade muito mais que uma IDE. Pode-se dizer que uma plataforma de desenvolvimento, no s atendendo vrias linguagens de programao, como tambm vrios objetivos, totalmente configurvel e customizvel. O Eclipse composto por um ambiente integrado de desenvolvimento (IDE) e um sistema de plugins que pode ser estendido pelos usurios. Ele foi quase totalmente escrito em Java, porm o seu sucesso se deve em boa parte ao fato de ser genrico o suficiente para atender vrias outras linguagens tais como: Ada, C, C++, COBOL, Perl, PHP, Python, R, Ruby (incluindo a framework Ruby on Rails), Scala, Clojure, Groovy e Scheme.
Um pouco de Histria:

As origens do Eclipse remontam ao VisualAge da IBM (uma IDE da dcada de 80), escrita em Smalltalk. Na dcada de 90, o VisualAge se tornou a IDE padro para os ambientes de desenvolvimento da IBM. No incio dos anos 2000 surge o VisualAge for Java, e logo depois o VisualAge Micro Edition, que suportava o desenvolvimento de aplicaes Java multi plataformas. Foi na verdade a reimplementao desta IDE em Java. Esta verso do VisualAge evoluiu para a plataforma de desenvolvimento Eclipse que conhecemos hoje.

Em Novembro de 2001, foi formado um consrcio para o futuro desenvolvimento do Eclipse como um projeto de cdigo aberto. Em Janeiro de 2004 a Eclipse Foundation foi criada. Em Junho de 2004, a primeira verso oficial do Eclipse (a 3.0), foi lanada, e desde ento, sempre no final de Junho de cada ano novas verses dos projetos da plataforma Eclipse so lanadas:

10

Release Data Juno 27 de Junho 2012 Indigo 22 de Junho 2011 Helios 23 de Junho 2010 Galileo 24 de Junho 2009 Ganymede 25 de Junho 2008 Europa 29 de Junho 2007 Callisto 30 de Junho 2006 Eclipse 3.1 28 de Junho 2005 Eclipse 3.0 21 de Junho 2004

Verso 4.2 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0

Projetos Juno projects Indigo projects Helios projects Galileo projects Ganymede projects Europa projects Callisto projects

Primeiros passos:

Agora que j temos o JDK instalado, vamos instalar a nossa IDE de trabalho, o Eclipse. Aqui tambm, se voc no tiver problemas de espao nem de performance, opte pelo Eclipse for Java EE que o que se encontra em ambientes corporativos. Se tiver algum tipo de limitao, opte pelo Eclipse Clssico, que menor e mais simples.

A verso mais recente do Eclipse quando da criao desta pgina a Indigo.


Instalando o Eclipse Indigo 3.7

Vamos escolher o Eclipse for Java EE, na pgina seguinte escolher aquele apropriado para a nossa plataforma de trabalho, e efetuar o download.

11

O processo de instalao extremamente simples, basta descompactar o arquivo baixado e criar um atalho na sua rea de trabalho para o executvel "eclipse.exe". O diretrio padro criado ao descompactar o arquivo ZIP o "eclipse" se voc j tiver outra verso do Eclipse instalada (que foi o meu caso), basta renomear o diretrio para "eclipseEE" por exemplo:

Ao tentar acionar o Eclipse pela primeira vez, provavelmente voc vai receber uma mensagem de erro, acusando uma falha ao tentar criar a mquina virtual.

Isso se deve ao fato de o arquivo de configurao padro no vir com a localizao da mquina virtual Java especificada. Para defini-la, basta editar o arquivo "eclipse.ini", e adicionar as seguintes linhas:
-vm D:\glassfish3\jdk7\bin\javaw.exe

Sendo a segunda, claro, adaptada para a localizao da JDK na dua mquina. O arquivo "eclipse.ini", possui vrias outras configuraes. Depois do tratamento, ele deve ter aproximadamente este contedo:
-startup plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502 -product org.eclipse.epp.package.jee.product --launcher.defaultAction openFile --launcher.XXMaxPermSize 256M -vm D:\glassfish3\jdk7\bin\javaw.exe

12

-showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m --launcher.defaultAction openFile -vmargs -Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m

Agora sim, ao chamar o Eclipse, a tela de carga deve surgir e logo em seguida, uma janela solicitando a escolha de um diretrio para a rea de trabalho (onde os seus projetos vo ser armazenados). Voc pode aceitar a sugesto padro ou escolher uma outra localizao ao seu gosto.

Depois disso, a tela de carga exibe o restante do processo de inicializao do Eclipse.

E na sequncia, voc deve visualizar a tela de "Bem Vindo" do Eclipse.

Voc pode fechar esta tela, e a qualquer momento, abri-la novamente usando: Help Welcome, e explorar todo o seu contedo com calma.

13

Tudo certo? Ento podemos prosseguir...

14

Aula 01 - Objetos e Classes Java


Objetos

Objetos no mundo real so facilmente identificveis: conceitualmente falando, pessoas, carros, bicicletas, gatos, so todos objetos, com caractersticas diferentes. No universo da programao, objetos so uma coleo de peas de software que possuem estado e comportamento relacionados. Neste contexto, Classes so plantas baixas ou prottipos, a partir das quais, os objetos so criados.
Classes Java

Uma Classe Java que pode servir de base para criar e atuar em objetos do tipo "bicicleta".
public class Bicicleta { // A Classe Bicicleta possui tres atributos public int cadencia; public int marcha; public int velocidade; // A Classe Bicicleta possui um construtor public Bicicleta(int cadenciaInicial, int velocidadeInicial, int marchaInicial) { marcha = marchaInicial; cadencia = cadenciaInicial; velocidade = velocidadeInicial; } // A Classe Bicicleta possui quatro metodos public void setCadencia(int novoValor) { cadencia = novoValor; } public void setMarcha(int novoValor) { marcha = novoValor; } public void acionaFreio(int diminui) { velocidade -= diminui; } public void aumentaVelocidade(int aumenta) { velocidade += aumenta; } }

O que um projeto Java?

Mas em bom Portugus, o que um projeto Java? Podemos dizer a grosso modo, que um projeto Java, nada mais do que uma estrutura de diretrios, onde so armazenados os cdigos fonte na linguagem Java (envolvendo as funcionalidades propriamente ditas e os seus testes) e os bytecodes resultantes do processo de compilao. Ao final do processo de desenvolvimento de uma aplicao Java, esta estrutura de diretrios empacotada num arquivo ZIP (podem ter extenses diferentes, mas so arquivos no formato ZIP). Este pacote ento copiado para um diretrio especfico do servidor de aplicaes, e l 15

descompactado, sendo os bytecodes direcionados para pastas especficas do servidor, ficando ento a aplicao Java disponvel para uso. Este o processo conhecido como "deploy de uma aplicao". A estrutura de um projeto Java, vai depender da Framework de desenvolvimento adotada e da complexidade do Projeto. Existem vrios exemplos de acordo com diferentes objetivos e nveis de complexidade aqui. Mas para a grande maioria dos casos, mesmo em empresas de grande porte, uma estrutura simples de projeto, contemplando uma nica aplicao com vrias funcionalidades suficiente. Para as nossas necessidades durante o curso, vamos adotar uma estrutura mais simples, assim:
src/ Contendo os cdigos fonte e demais recursos necessrios a Aplicao test/ Contendo os cdigos fonte e demais recursos necessrios aos Testes da Aplicao

O que um pacote dentro de um projeto Java?

Os nossos arquivos fonte, estaro portanto localizados em algum lugar nesta estrutura de diretrios, agrupados por tipo e funcionalidade. Os vrios tipos de arquivos Java que compem um projeto se relacionam. Para que estes arquivos se localizem uns aos outros, existe uma estrutura de nomenclatura que associa nomes qualificados localizao fsica dos arquivos. Ento, o diretrio que agrupa arquivos de um determinado tipo ou funcionalidade num projeto Java, chamado de "pacote" (package). Ento, por exemplo: um programador, criando uma funcionalidade chamada "tutorial" para um domnio chamado "java.iniciantes.com", dever identificar o diretrio onde esto localizados os arquivos que compem a aplicao com o seguinte nome de pacote: "com.iniciantes.java.tutorial" Este nome de pacote, se traduz fisicamente na seguinte estrutura de diretrios: "src\com\iniciantes\java\tutorial" Considerando o que foi visto acima, segue um exemplo de uso de um objeto da classe Bicicleta:
package com.iniciantes.java.tutorial; public class Controle { public void movimentaMagrela() { Bicicleta magrela = new Bicicleta(10,10,10); magrela.aumentaVelocidade(15); magrela.setMarcha(4); magrela.acionaFreio(20); magrela.setMarcha(2); magrela.setCadencia(5); } }

16

A nossa Aplicao

Durante o curso, estaremos desenvolvendo uma aplicao simples para controle de emprstimo de livros de uma "biblioteca entre amigos". A aplicao vai registrar livros, amigos e quais amigos pediram emprestado quais livros. Para tal, vamos usar 3 classes:

Pessoa: nome e numero mximo de livros que esta pessoa pode pedir emprestado. Livro: ttulo, autor, pessoa com quem est emprestado. Biblioteca: lista de livros e lista de pessoas que podem emprestar livros.

Criando um projeto Java no Eclipse

Para o nosso curso, vamos criar um projeto chamado: JavaParaIniciantes. Passo a passo: Aps abrir o Eclipse, vamos usar: File New Java Project

Repare que se voc, assim como eu, instalou e configurou a verso mais atual do JDK, pode ocorrer algum tipo de incompatibilidade.

17

Se for este o caso, escolha uma verso mais antiga que seja compatvel.

Agora, vamos aceitar as opes default e finalizar.

Pronto! O seu projeto Java deve estar criado. Mas repare entretanto, que h um problema reportado na aba "Problems", na parte de baixo da tela

18

Podemos sempre tentar resolver os problemas usando: Boto direito do mouse sobre a linha do problema Quick Fix

Mas neste caso, isto no vai ser suficiente. Vamos fazer da seguinte forma: Boto direito do mouse sobre o projeto Properties

19

Na opo "Java Build Path", na aba "Libraries", vamos selecionar a JRE disponvel e acionar o boto "Edit"

Vamos escolher a verso adequada do ambiente de execuo.

E acionar o boto "OK"

Com isso o problema reportado deve desaparecer. A estrutura de diretrios que d suporte ao nosso projeto neste momento a seguinte:

20

Criando um pacote no Eclipse

Com o projeto criado, devemos agora criar o pacote que ir agrupar seus componentes. Passo a passo: Vamos selecionar a pasta "src" e usar: Boto direito do mouse New Package

Seguindo o padro de nomenclatura anteriormente citado, vamos criar o pacote com o seguinte nome: "com.iniciantes.java.tutorial"

21

Agora ns temos o pacote criado:

Criando uma Classe no Eclipse

Vamos agora criar a primeira Classe do nosso pacote. Passo a passo: Vamos selecionar o pacote "com.iniciantes.java.tutorial" e usar: Boto direito do mouse New Class

Seguindo a descrio da nossa aplicao, vamos comear pela Classe Pessoa.

22

Agora ns temos a Classe criada:

A linha identificada com o nmero 1 registra o nome do pacote onde a classe est localizada. A linha identificada com o nmero 2 registra a assinatura da Classe. A estrutura de diretrios que d suporte ao nosso projeto neste momento a seguinte:

Com a classe pessoa criada, o prximo passo : definir os atributos que vo caracterizar os objetos pertencentes a esta Classe.

Repare o asterisco antes do nome do arquivo. Ele indica que o arquivo foi alterado e ainda no foi salvo. A linha identificada com o nmero 1 um comentrio simples (uma nica linha). As linhas identificadas com os nmeros 2 e 4 so as definies dos atributos propriamente ditos. O grupo de linhas identificado com o nmero 3 um comentrio composto de vrias linhas.

23

Tipos de dados primitivos do Java:


Tipo Descrio boolean Pode assumir o valor true ou o valor false Caractere em notao Unicode de 16 bits. Serve para a armazenagem de dados alfanumricos. Tambm pode ser usado como um dado inteiro com valores na faixa entre 0 e 65535. byte Inteiro de 8 bits em notao de complemento de dois. Pode assumir valores entre -27=-128 e 27-1=127. Inteiro de 16 bits em notao de complemento de dois. Os valores possveis cobrem a faixa de -2-15=short 32.768 a 215-1=32.767 Inteiro de 32 bits em notao de complemento de dois. Pode assumir valores entre -231=2.147.483.648 e int 231-1=2.147.483.647. long Inteiro de 64 bits em notao de complemento de dois. Pode assumir valores entre -263 e 263-1. Representa nmeros em notao de ponto flutuante normalizada em preciso simples de 32 bits em float conformidade com a norma IEEE 754-1985. O menor valor positivo representvel por esse tipo 1.40239846e-46 e o maior 3.40282347e+38 Representa nmeros em notao de ponto flutuante normalizada em preciso dupla de 64 bits em double conformidade com a norma IEEE 754-1985. O menor valor positivo representvel 4.94065645841246544e-324 e o maior 1.7976931348623157e+308 char

A Classe String:
java.lang.String Representa Strings de caracteres.

Uma das vantagens do uso do Eclipse, que ele avalia o que digitado dinamicamente, e quando o arquivo salvo ele exibe erros e alertas na aba "Problems".

Neste caso, repare que as palavras em Portugus esto sublinhadas em vermelho. Isto ocorre porque o dicionrio padro em Ingls. Alm disso, existem dois alertas sobre a criao de variveis que no esto sendo utilizadas. Sobre os alertas, eles desaparecero na sequncia, quando forem criados mtodos que usam as variveis criadas. J sobre o dicionrio, vamos aprender a configur-lo para Portugus. Para isso, o primeiro passo conseguir um dicionrio em Portugus no formato adequado. Na verdade, simples, um arquivo texto com uma palavra por linha. Eu tenho uma verso deste arquivo que voc pode baixar daqui. 24

Descompacte o arquivo e coloque-o no diretrio onde o Eclipse foi instalado. Agora use: Window Preferences Na tela seguinte, selecione: General Editors Text Editors Spelling Altere "Platform dictionary" para "none". E em "User defined dictionary" localize e selecione o arquivo que voc baixou.

Com isso, basta fechar e abrir novamente o arquivo, que a maioria das palavras ser reconhecida. Aquelas que no forem, devem ser includas no dicionrio, assim:

25

Continuando com a nossa Classe, hora de criar o mtodo construtor. O mtodo construtor de uma Classe chamado sempre que uma nova instncia de objeto daquela classe criada. Um mtodo construtor igual a qualquer mtodo pblico, exceto que ele usa o mesmo nome da Classe e no pode retornar nenhum valor. Usando uma outra Classe Pessoa como exemplo, um mtodo Construtor ficaria assim:
public class Pessoa { private private private private String String String String primeiroNome; ultimoNome; endereco; nomeDeUsuario;

// O metodo construtor public Pessoa() { } }

Neste exemplo, o mtodo construtor no faz nada, mas no nosso caso, vamos us-lo para inicializar os objetos do tipo "Pessoa" criados com valores default. Outra vantagem do uso do Eclipse, que ele pode completar o cdigo que digitamos. Por exemplo: se digitamos um abre chaves "{" e teclamos "Enter", ele cria e identa um fecha chaves "}" automaticamente.

Outra forma de completar o cdigo no Eclipse, digitar parte de um nome definido e usar: "CTRL" + "Espao". Esta ao apresenta uma lista de nomes definidos que comeam com a parte digitada. Bastando escolher da lista o item desejado e teclar "Enter".

26

Isso completa a nossa primeira aula. Tendo criado a Classe Pessoa, com seus atributos e mtodo Construtor. Os alertas sero resolvidos na prxima aula quando os mtodos get e set para os atributos da Classe forem criados.

Tudo certo? Ento podemos prosseguir...

27

Aula 02 - Classes e Mtodos Java


Sobre a interface do Eclipse

Vamos comear esta segunda aula conhecendo um pouco mais sobre a interface do Eclipse. A referncia oficial para a Interface com o usurio do Eclipse est aqui. De volta ao Eclipse, a primeira coisa que notamos que ele tem memria! Abre exatamente da forma que o deixamos da ltima vez.

Quando o Eclipse carregado, ele nos apresenta uma espcie de bancada de trabalho (Workbench), Esta bancada composta de algumas reas que vamos explorar um pouco na sequncia, mas a principal delas, claro, a do Editor.

Um duplo click na aba do arquivo sendo editado, maximiza a janela do Editor fazendo-a ocupar toda a rea da bancada de trabalho. Vamos fazer isso, e comentar um pouco mais sobre as facilidades que o editor de cdigo do Eclipse oferece.

28

Alm daquelas mais bsicas como colorir o cdigo, separando as palavras chave da linguagem do restante do cdigo, identificando os comentrios, os smbolos e outras partes do cdigo, edentao e formatao automtica. Existem vrios auxlios visuais, como por exemplo: indicador de que o arquivo foi alterado mas no foi salvo, indicadores de erros e alertas, indicadores de fechamento de blocos, e muitos outros. Para mudar as configuraes do Eclipse em geral, normalmente existe mais de uma opo. Como exemplo, vamos alterar uma caracterstica do editor que vai ser necessria, principalmente quando for necessrio usar o modo de debug. Exibir o nmero das linhas do cdigo. Para isso, temos duas opes: 1. Da barra de Menu, "Window" "Preferences..." 2. Na opo "General" "Editors" "Text Editors", marque o checkbox "Show line numbers". 1. CTRL+3 2. Digite: "line numbers" 3. ENTER Usando esta ltima opo, temos:

29

E como resultado:

reas de trabalho da bancada do Eclipse

Vamos agora explorar um pouco as demais reas do Workbench do Eclipse. A primeira informao importante a respeito destas reas, que o contedo, formato e localizao delas, no fixo. Voc pode customizar tudo ao seu gosto. Vamos elenc-las aqui, usando a configurao default.

1. 2. 3. 4. 5. 6.

rea de topo 1 - Barra de Menu rea de topo 2 - Barra de Ferramentas rea esquerda com o "Visualizador de Projeto ou Pacote" rea direita com ao "Lista de tarefas e a Viso macro da Classe" rea de baixo com vria abas informativas rea de rodap com informaes complementares

Cada uma destas reas pode ser configurada para exibir uma ou mais Vises (Views), a distribuio destas reas e os seus respectivos contedos, vo compor uma Perspectiva 30

(Perspective) do Eclipse para uma tarefa especfica. A perspectiva Java por exemplo, visa facilitar o processo de codificao. Uma outra grande vantagem do Eclipse, que voc pode criar e salvar novas perspectivas totalmente personalizadas. A ttulo de exemplo, vamos abrir a perspectiva "Java Browsing" e observar como so distribudas as views que a compem pela rea de trabalho do Eclipse.

Minha sugesto que voc procure alterar esta perspectiva de forma semelhante (no necessariamente igual), ao exemplo abaixo, e salv-la com o seu nome para uso futuro.

31

De volta ao Java

Convm falar sobre alguns smbolos especiais da linguagem Java.

; - delimitador de comando { e } - delimitadores de bloco ( e ) - delimitadores de parmetros de mtodos // - incio de comentrio /* e */ - delimitadores de bloco de comentrio = - operador de atribuio

Mtodos Java

Falando em termos de orientao a Objetos, um mtodo representa uma operao num objeto em particular. Sendo um objeto uma instncia de uma Classe, quando definimos uma Classe, definimos os seus atributos atravs de variveis e seu comportamento atravs de mtodos. Aqui est um exemplo de uma tpica declarao de mtodo em Java:
public double calculaVoo(double envergadura, int motores, double tamanho, double tonelagem) { // faz o calculo complicado aqui. return 10L; }

Para declarar um mtodo, os nicos elementos necessrios so: o tipo de retorno, o nome do mtodo, um par de parnteses e um corpo delimitado por chaves. De maneira mais formal, seguem todos os elementos que podem vir a compor a declarao de um mtodo em Java: 1. Modificadores tais como: public, private, e outros que voc ver no futuro. 2. O tipo de dado retornado pelo mtodo, ou void se o mtodo no retornar um valor. 3. O nome do mtodo seguindo as regras de nomes de campos, mas com uma conveno um pouco diferente. 4. A lista de parmetros separados por vrgula, precedidos dos seus respectivos tipos de dado, delimitados por parnteses, (). Se no houver parmetros, deve-se usar, os parenteses vazios. 5. Uma lista de possveis excees, que voc tambm ver no futuro. 32

6. O corpo do mtodo, com todo o seu cdigo delimitado por chaves, incluindo a declarao de variveis locais ao mtodo.
De volta ao nosso projeto

Voltando nossa Classe Pessoa, j havamos criado um mtodo construtor para inicializar as instncias do objeto Pessoa com valores default. Vamos agora tratar dos mtodos "getter" e "setter" responsveis por expor as caractersticas do objeto instanciado. No vamos discutir aqui a questo de expor a implementao de um objeto para outras Classes em relao aos princpios de Orientao a Objetos. Mtodos "getter" e "setter" so usados para recuperar e manipular variveis privadas de uma Classe diferente. Um mtodo "getter", como o nome sugere, recupera o atributo de mesmo nome. Um mtodo "setter" permite atribuir um valor ao atributo de mesmo nome. Vamos comear pelo mtodo "getNome", assim:

Repare que imediatamente aps salvar o cdigo alterado, os contedos das Views "Package Explorer" e "Problems" so alterados de acordo. Na primeira, a referncia ao novo mtodo surge. E na segunda, a referncia ao alerta de falta de uso do atributo "nome" desaparece, enquanto a referncia ao mesmo tipo de alerta para o atributo "maxLivros" permanece. Para criar o prximo mtodo, vamos usar a facilidade de "completar o cdigo" que o Eclipse nos d, assim:

33

Com esta combinao, o Eclipse nos d uma matriz para a criao de um mtodo pblico. Na sequncia, usando a tecla TAB, vamos alterando os prximos elementos da matriz fornecida, assim:

Ento depois de preencher: o tipo de retorno, o nome, o parmetro e teclar TAB mais uma vez, estamos prontos para digitar o cdigo que vai compor o mtodo.

Neste caso, uma simples atribuio.

Apesar de ter sido usada a facilidade de "completar cdigo" do Eclipse, estes dois primeiros mtodos foram criados praticamente de forma manual. No entanto, O Eclipse possui uma facilidade ainda maior neste sentido, podendo gerar os mtodos "getters" e "setters" automaticamente para ns. Vamos fazer uso desta facilidade para gerar os mtodos para o atributo "maxLivros", assim:

34

Na Janela apresentada, selecionamos os campos para os quais queremos gerar os mtodos e acionamos o boto "OK".

E o Eclipse gera os mtodos para ns, assim:

35

Existem algumas diferenas entre os mtodos get e set que ns criamos e estes ltimos criados automaticamente pelo Eclipse: a primeira o tipo de dado sendo tratado. A segunda o uso do qualificador "this", que indica a instncia corrente do objeto, que um comportamento padro, por isso no o usamos anteriormente. Outro detalhe que o eclipse usa como nome da varivel do parmetro do mtodo "set", o mesmo nome da varivel da classe, assim:

Revisando, uma Classe Java deve conter Atributos e Mtodos, definindo suas Caractersticas e seu Comportamento: 1. 2. 3. 4. Campos de dados Mtodos Construtores para criar objetos Mtodos getters e setters para trabalhar as caractersticas do objeto Mtodos de comportamento. A lgica de negcio propriamente dita

O Eclipse nos ajuda

O Package Explorer do Eclipse, permite uma viso esquemtica da Classe, com seus elementos.

Reparem que se for retirado o qualificador "this" na instruo de atribuio do mtodo "setMaxLivros", um alerta exibido.

36

Isto se deve ao fato de o Java no saber mais se se trata de um atributo da classe ou uma varivel local. Para evitar este problema, podemos manter o nome da varivel do parmetro igual ao do atributo retornando o qualificador "this", ou mudar o nome da varivel do parmetro. Para manter o padro usado no atributo "nome", vamos usar esta segunda opo.

A esta altura, voc deve ter a classe construda desta forma:


package com.iniciantes.java.tutorial; public class Pessoa { // Atributos private String nome; // nome da pessoa /* Nmero mximo de Livros que * uma pessoa pode pedir emprestado */ private int maxLivros; // Construtor public Pessoa() { nome = "Nome Desconhecido"; maxLivros = 3; } // Mtodos public String getNome() { return nome; }

37

public void setNome(String outroNome) { nome = outroNome; } public int getMaxLivros() { return maxLivros; } public void setMaxLivros(int outroValor) { maxLivros = outroValor; } } view raw pessoa01.java This Gist brought to you by GitHub.

Caso exista alguma diferena, volte e faa uma reviso nas duas primeiras aulas.

Tudo certo? Ento podemos prosseguir...

38

Aula 03 - Usando o Scrapbook do Eclipse


O que o Scrapbook?

Nesta aula, vamos explorar um pouco as caractersticas da Classe Pessoa usando o Scrapbook do Eclipse. O Scrapbook uma "joia" escondida no Eclipse, principalmente para os iniciantes em Java, pois permite explorar as instrues Java de forma interativa e ver o que cada uma delas faz internamente.
Usando o Scrapbook

Para usar o Scrapbook, devemos criar uma pgina de Scrapbook, que permite executar comandos e expresses Java sem precisar criar um programa para isso. Para criar uma pgina de Scrapbook, vamos fazer assim: Boto direito do mouse sobre o projeto New Other.

Na janela de "Wizards" que apresentada, selecione: Java Java Run/Debug Scrapbook Page Next.

39

Especifique um nome para a pgina e acione o boto Finish.

Com isso, devemos ter a nova pgina de Scrapbook aberta, assim:

Codificando e Inspecionando

Vamos comear claro, com algo bem simples:

Temos algumas alternativas para inspecionar o resultado de expresses como esta. Vamos comear, usando o menu da seguinte forma: Selecione o texto da expresso desejada:

40

Em seguida: Run Inspect.

Que deve apresentar o seguinte resultado:

Os espaos entre os argumentos e operadores nas expresses Java, no tem significado para o compilador, portanto, "2+2" e "2 + 2", so tratados exatamente da mesma forma. Vamos ver agora um trecho de cdigo sendo inspecionado:

41

Que deve apresentar o seguinte resultado:

Ocorre que eu esqueci de encerrar o comando "a = a * 10" com um ";". Vamos corrigir isso e tentar novamente.

Uma outra forma de verificar o resultado de expresses : Run Display.

Que deve apresentar o seguinte resultado:

42

Vamos agora inspecionar uma expresso Java para criar um objeto do tipo Date "new java.util.Date()", assim:

Reparem que: na janela de inspeo, temos acesso a todos os atributos do objeto criado. J para avaliar trechos de cdigo Java, devemos usar a opo Run Execute, ou ento:

O resultado da execuo do comando ou comandos, exibido na aba "Console". Nota: Certifique-se de deixar a instruo que voc deseja inspecionar sem o ";" no final.

43

Experincias com a classe Pessoa

J sabendo como usar o Scrapbook, precisamos agora us-lo com a classe Pessoa criada anteriormente. Observando o Package Explorer, podemos ver que a pgina do nosso Scrapbook, est fora do pacote da Classe Pessoa.

Existem vrios pacotes criados por terceiros disponveis para uma aplicao Java. Sendo assim, nada impede de algum ter criado uma outra Classe chamada Pessoa com caractersticas e comportamentos diferentes dos da Classe que ns criamos. A criao e uso de pacotes facilita a identificao de classe de mesmo nome mas com caractersticas diferentes. No nosso caso, quando mencionamos no nosso projeto a Classe "Pessoa", o compilador entende: "com.iniciantes.java.tutorial.Pessoa". Para que possamos portanto, fazer experincias com a Classe Pessoa no nosso Scrapbook, devemos importar o pacote onde est localizada a Classe. Vamos aproveitar e conhecer os botes da barra de ferramentas usados nas operaes do Scrapbook:

Usando o boto de configurao dos imports, vamos importar para o nosso Scrapbook o pacote da classe Pessoa.

44

Agora, o nosso Scrapbook entende que: quando mencionamos a Classe "Pessoa", estamos na verdade nos referindo a: "com.iniciantes.java.tutorial.Pessoa". Isso feito, podemos comear nossas experincias com a Classe Pessoa. Vamos comear, criando um objeto (instncia da Classe) do tipo "Pessoa", com a seguinte instruo:
Pessoa p = new Pessoa();

Sendo:

"Pessoa": o tipo do objeto que est sendo criado (a Classe do objeto). "p": a varivel que vai representar o objeto (instncia da Classe) que est sendo criado. "new": palavra reservada de Java que instrui o compilador a criar um novo objeto do tipo desejado. "Pessoa()": mtodo construtor da Classe, a ser usado na criao do objeto.

Para permitir a inspeo desta instruo, precisamos complementar este trecho de cdigo com a simples meno da varivel "p", para que observemos o seu contedo, assim:

45

Podemos observar que: uma vez criado, o objeto assume as caractersticas definidas no mtodo construtor padro da Classe Pessoa, ou seja:

maxLivros = 3 nome = "Nome Desconhecido"

Agora, se digitamos um ponto ao lado da varivel "p", que no momento representa um objeto do tipo Pessoa, podemos ver todos os mtodos definidos para este objeto, assim:

Alguns destes mtodos, foram criados por ns, como se pode ver no exemplo. Mas por outro lado, podemos ver vrios outros que no foram criados por ns. De onde eles surgiram? Na verdade, aqui podemos observar pela primeira vez um exemplo de "herana" em Java. Todas as Classes Java, so subclasses da Classe "Object", portanto, todas as Classes Java, herdam os mtodos da Classe "Object". A Classe "Object" pode ser considerada o "Poderoso Chefo" das Classes, ou "a Classe de todas as Classes". A forma de chamar um mtodo de um objeto em Java, usando o ".", logo depois do nome da varivel que representa o objeto. Quando usamos o "." no Eclipse, ele nos abre uma lista dos mtodos conhecidos daquele objeto para que possamos escolher o que desejamos usar no momento. Vamos comear nossas experincias, mudando o nome padro do objeto pessoa que acabamos de criar, assim:

Reparem que o Eclipse possui um sistema de ajuda instantneo, e j indica o tipo de dado que precisa ser passado para o mtodo. Prosseguindo temos o seguinte:

46

Inspecionando...

Vamos prosseguir, alterando o nmero mximo de Livros para 9, assim:

A ttulo de aprendizado, vamos ver uma outra forma de exibir o resultado, usando um mtodo "get" e usando a opo de "Exibir o Resultado da Avaliao", assim:

Ainda a ttulo de aprendizado, vamos simular um erro e observar como o Eclipse lida com isso. Vamos supor que ao tentar verificar o resultado da aplicao do mtodo "getMaxLivros()", tenhamos esquecido de digitar o "()", assim:

47

O Eclipse nos ajuda com mensagens de erro bem claras, assim:

Neste caso, informando que: devido ausncia do (), o nome "getMaxLivros", foi entendido como sendo um possvel nome de varivel, e como no existe nenhuma varivel definida com este nome, o compilador simplesmente no consegue "resolver" este nome. O Eclipse portanto, no s ajuda evitando que voc precise digitar muita coisa, mas tambm ajuda quando ocorrem erros de digitao, como no exemplo acima. Tudo certo? Ento podemos prosseguir...

48

Aula 04 - JUnit no Eclipse - parte 1


Testes de software

O assunto desta aula sobre testes. Teste de software um dos assuntos mais ricos e controversos que temos na rea de de desenvolvimento de software e at no gerenciamento de projetos de software. Sendo assim, acabei por criar uma pgina especfica para tratar deste assunto, de forma mais abrangente, indo alm de Java e JUnit. Esta pgina, pode ser acessada aqui.
O que o JUnit?

O JUnit um framework de suporte a testes automatizados para a linguagem de programao Java. Ela tem sido importante na popularizao do Test Driven Development (TDD) ou "Desenvolvimento Orientado a Testes".
Como funciona o JUnit?

Em termos de funcionamento, o JUnit um programa usado para executar testes unitrios em virtualmente qualquer aplicao. Os testes com JUnit so efetuados escrevendo "casos de teste" em Java, compilando estes casos de testes e executando as classes resultantes com o "JUnit Test Runner".
Obtendo o JUnit

O JUnit, pode ser obtido no site da JUnit.org. Mas na prtica, no caso dos usurios do Eclipse, ele j vem disponvel como um plugin, possuindo sua prpria View, a qual podemos exibir usando: Window Show View Other, e na janela que se abre, selecionar Java JUnit.

49

Mas o que so testes unitrios afinal?

Testes Unitrios constituem um processo de desenvolvimento de software onde a menor poro "testvel" de uma aplicao, chamada unidade, individual e independentemente verificada em relao ao comportamento dela esperado. Testes Unitrios so em geral automatizados, mas podem ser feitos manualmente. Testes Unitrios envolvem apenas as caractersticas essenciais da unidade sob teste. Isso encoraja o desenvolvedor a poder alterar livremente a implementao de uma unidade buscando uma melhor performance por exemplo, sem se preocupar com uma possvel interferncia em outras unidades ou na aplicao como um todo. Uma vez que todas as unidades de uma aplicao estiverem funcionando de forma satisfatria e sem erros, pores maiores da aplicao podero ser avaliados na forma de testes integrados, depois com testes do sistema e finalmente com testes de aceitao. Os testes unitrios so a base de todo o processo de testes.
Preparando o ambiente de Testes

O primeiro passo definir onde no projeto vo ficar os nossos testes. A no ser que exista orientao do cliente em contrrio, o normal, que no desejamos incluir os nossos testes no pacote a ser entregue para deploy. Sendo assim, faz sentido armazenar as Classes de teste numa pasta diferente da usada para armazenar as Classes com o cdigo da aplicao propriamente dito. Observando a janela do "Package Explorer", podemos ver a localizao da nossa Classe de negcio (Classe Pessoa).

Vamos ento criar uma pasta no mesmo nvel da pasta "src", com o nome "test". Vamos fazer da seguinte forma: Boto direito do mouse sobre o projeto New Source Folder

50

Na janela que se abre, digitar o nome da pasta ("test" neste caso) e acionar o boto "Finish".

Com isso, temos agora a seguinte estrutura:

Para manter a organizao, vamos querer que as nossas Classes de teste fiquem sob os mesmos pacotes que as Classes sendo testadas. Sendo assim, vamos criar o mesmo pacote sob a pasta "test" que acabamos de criar. Para isso, vamos selecionar a pasta "test".

Usar na barra de menu: File New Package, assim:

51

E na janela que se abre, digitar o mesmo nome de pacote usado na pasta "src", assim:

Obtendo:

Sobre o uso de Menus no Eclipse

Na maior parte das aes que efetuamos sobre itens de um projeto, podemos optar por usar... A barra de menus sobre um item selecionado:

52

O menu flutuante, usando o boto direito do mouse, tambm sobre um item selecionado:

O nosso primeiro cdigo de teste

Agora, estamos prontos para criar o nosso primeiro teste usando JUnit. Para isso, vamos contar com a ajuda de uma facilidade do Eclipse. O Eclipse possui modelos de ajuda prontos (Wizards) para efetuar vrias tarefas. Criar testes usando JUnit, uma delas. Usando o menu flutuante, vamos marcar o package que acabamos de criar e selecionar o Wizard: New JUnit Test Case, assim:

53

Na janela que se abre, vamos digitar um nome para a nossa Classe de teste. Um padro que pode e deve ser seguido aqui : usar para o nome da Classe de teste, o nome da Classe sendo testada, seguido do sufixo "Test". Alm disso, necessrio digitar o nome da Classe sendo testada. Teremos portanto, a tela assim:

A tela no exibe nenhum erro ou alerta. Tudo est certo, pois o JUnit 4 j est disponvel nesta instalao. A ttulo de aprendizado, vamos alterar a verso do JUnit para 3 e observar o que acontece:

54

Reparem que agora surge um alerta indicando que a Super Classe "TestCase" do JUnit no existe. Isso se deve ao fato de o pacote (JAR) do Junit 3 no estar configurado no "caminho de construo" (build path) do projeto. O "build path" indica a localizao de todas as bibliotecas externas necessrias compilao da aplicao. O JUnit uma dessas bibliotecas externas, da a necessidade de uma referncia a ela constar no "build path". Vamos ignorar isso no momento e seguir adiante com o boto "Next". Na tela que se segue, podemos escolher os mtodos para os quais vamos gerar cdigo de teste. No s mtodos da Classe Pessoa, como tambm os mtodos da Classe Object, da qual a Classe Pessoa herda. Vamos escolher no momento, o mtodo construtor da Classe Pessoa e tambm os mtodos "set", assim:

55

Ao acionar o boto "Finish", o eclipse abre uma outra janela, dando chance de resolver o problema detectado anteriormente, adicionado o JUnit 3 no "buid path". Vamos, mais uma vez, ignorar este problema selecionando a opo "Not now" e acionado o boto "OK".

O que nos leva a seguinte situao:

Como era de se esperar, a nossa classe de teste foi criada, porm surgem vrias indicaes de erro. Vamos analisar cada uma destas indicaes: 1. No Package Explorer, podemos ver que o projeto como um todo, est marcado com erro, porque alguma parte dele est com erro. Neste caso, a classe "PessoaTest" dentro do pacote "com.iniciantes.java.tutorial" dentro da pasta "test". 2. Na janela de cdigo, podemos ver a nossa Classe de teste com indicaes de erro em toda linha que menciona recursos do JUnit, inclusive no "import". 3. Na aba de "Outline", podemos ver de forma esquemtica onde ocorrem os erros no nosso cdigo. 4. Na aba "Problems", temos acesso individualizado a cada linha de cdigo causando problema, indicando sua localizao exata. Vamos ento usar esta ltima rea para aprender como resolver problemas no nosso cdigo com a ajuda do Eclipse. 56

Comeando pelo problema indicado da linha 3 (o import), vamos acionar a opo "Quick Fix", usando o boto direito do mouse sobre ele, assim:

Na janela que surge, selecionamos: "Fix project setup..."

E na janela seguinte: "Add JUnit 3 library to the build path"

O que faz com que os erros desapaream, assim: 57

Reparem que o pacote JUnit 3 foi adicionado ao nosso projeto. A opo "Quick Fix" do Eclipse oferece:

Sugestes para corrigir erros de compilao Implementa os ajustes selecionados automaticamente Pode-se usar o boto direito do mouse ou o atalho CTRL-1 O Quick Fix do Eclipse o melhor amigo do desenvolvedor.

Para entender um pouco mais do que o Eclipse fez para corrigir o erro, vamos verificar o "buid path" do nosso projeto. Poderiamos usar: boto direito do mouse sobre o projeto Properties. Mas desta vez, vamos usar um atalho: Selecione o projeto e use: Alt + Enter. Na janela que se abre, selecionar: "Java Buid Path" e a aba "Libraries"

58

Podemos ver que o pacote do JUnit 3 foi adicionado ao "buid path". Ns poderamos obter o mesmo efeito, usando o boto "Add Library", localizando o pacote do JUnit 3 no nosso sistema de arquivos e selecionando-o.

Vamos examinar o cdigo gerado linha a linha, e entend-lo.

1 - Identificao do pacote da nossa Classe de teste 3 - Import do pacote do JUnit para a Classe "TestCase" 5 - Declarao da nossa Classe de teste "PessoaTest" estendendo a Classe "TestCase" do JUnit 7 - Declarao do mtodo de teste para o mtodo Construtor da Classe Pessoa 11 - Declarao do mtodo de teste para o mtodo setNome da Classe Pessoa 15 - Declarao do mtodo de teste para o mtodo setMaxLivros da Classe Pessoa

Sendo a nossa Classe "PessoaTest" uma Subclasse de "TestCase", podemos usar os mtodos herdados desta ltima. No momento, todos os mtodos de teste esto usando o mtodo "fail", apenas para gerar um resultado padro dizendo que o teste ainda no foi implementado. Vamos executar os mtodos de teste da forma que esto e ver o que acontece, assim:

59

Podemos observar na rea inferior, na aba JUnit, o resultado da execuo de todos os mtodos de teste. Para cada um deles a mensagem j esperada de "Not yet implemented" exibida.

O prximo passo, modificar os mtodos que foram criados automaticamente para efetivamente testar os mtodos implementados na Classe Pessoa.

Tudo certo? Ento podemos prosseguir...

60

Aula 05 - JUnit no Eclipse - parte 2


JUnit Bsico

Neste tpico vamos comear com um exemplo simples para ilustrar os conceitos bsicos envolvidos nos testes com JUnit.
package com.iniciantes.java.tutorial; import junit.framework.TestCase; public class SimpleTest extends TestCase { public SimpleTest(String name) { super(name); } public void testSimpleTest() { int answer = 2; assertEquals((1+1), answer); } } view raw SimpleTest.java This Gist brought to you by GitHub.

Vamos analisar este exemplo linha a linha:


import junit.framework.*;

Como ns estamos usando recursos criados pela equipe do JUnit, precisamos importar as classes que desejarmos usar. A maioria reside no subdiretrio "framework", da a necessidade do comando import.
public class SimpleTest extends TestCase {

A nossa Classe de teste precisa definir seus prprios mtodos para ter qualquer utilidade para ns. Sendo assim, ela estende a Classe "TestCase" a qual vai nos permitir criar nossos prprios mtodos de teste.
public SimpleTest(String name) { super(name); }

Todo teste, recebe um nome para que quando observamos o resultado geral de todos os testes possamos distinguir qual teste gerou o erro se for o caso. O mtodo construtor prov esta funcionalidade passando o parmetro recebido para a Classe pai.
public void testSimpleTest() { int answer = 2; assertEquals((1+1), answer); }

Este no momento o nico teste constante do nosso "TestCase". Poderiam haver mais, tantos quantos voc quisesse. Voc pode ver que podemos definir variveis e efetuar clculos como qualquer outro programa Java. 61

public void testSimpleTest() { int answer = 2; assertEquals((1+1), answer); }

Vamos ver o resultado da execuo deste teste, usando: boto direito do mouse sobre a Classe de teste Run As JUnit Test

Se alterarmos o valor da varivel "answer" para algo diferente de "2" e executarmos o teste novamente, vamos obter um erro, assim:

Este teste simples, testa se 1+1 igual ao valor de answer. Este apenas um exemplo de teste extremamente simples.

62

Normalmente, o que desejamos testar o resultado de algum mtodo. Por exemplo, um mtodo que remova todos os caracteres "a", de um String. Voc pode test-lo assim:
public void testStringStripFunction() { String expected = "bb" StringStripper stripper = new StringStripper(); assertEquals(expected, stripper.stringStrip("aabaaaba")); }

O que pode fazer o "assertEquals" falhar se o mtodo StringStripper no se comportar como esperado. Assim, podemos tentar corrigir o mtodo e executar o teste novamente at que ele tenha sucesso.
De volta aos nossos testes

Voltando aos nossos testes, vamos comear, implementando um teste real para garantir que o mtodo Construtor da Classe Pessoa esteja fazendo o que dele se espera. Vejamos o mtodo Construtor:
public Pessoa() { nome = "Nome Desconhecido"; maxLivros = 3; }

Ele deve inicializar uma nova instncia da Classe Pessoa com "Nome Desconhecido" para o atributo "nome" e "3" para o atributo "maxLivros". O que precisamos fazer criar um mtodo de teste que verifique se estes valores esto corretos. Vamos usar alguns assistentes do Eclipse para nos ajudar a criar este teste, assim: No mtodo "testPessoa()" retiramos a chamada do mtodo "fail" e digitamos a instruo "new" + CTRL + Espao, o que nos apresenta o seguinte:

Selecionar a opo "create new object", o que leva ao seguinte:

Vamos agora alterar cada um dos parmetros, usando a tecla TAB para navegar entre eles, o que nos leva ao seguinte:

63

Agora, temos definida uma instncia "p1" da Classe Pessoa. Reparem no alerta esquerda da linha 8. Ele indica que a varivel "p1" no est sendo usada. Se uma nova instncia da Classe Pessoa foi criada, o seu mtodo Construtor foi executado. Vamos agora complementar o nosso teste verificando se os valores dos atributos esto com os valores esperados, usando o mtodo "assertEquals" do JUnit, assim:

E preenchendo os parmetros, assim:

O que nos leva ao seguinte:

Para completar, vamos corrigir o erro indicado colocando o ";" ao final da linha, e adotar o mesmo procedimento para o atributo "maxLivros". O que nos leva ao seguinte:

O que estamos fazendo aqui : verificando com o mtodo "assertEquals" se os atributos esto com os valores esperados depois que o mtodo Construtor da Classe Pessoa foi executado.

64

Mas de onde vem o mtodo "assertEquals" ? Ele vem da Classe "TestCase" que a Super Classe da nossa Classe "PessoaTest". E por que este mtodo no pode ser chamado da seguinte forma:
PessoaTest pt = new PessoaTest(); pt.assertEquals(...);

A resposta que o mtodo "assertEquals" um mtodo esttico (cuja declarao deve conter o modificador static). Um mtodo esttico, no pertence a nenhuma instncia de uma Classe, e sim Classe como um todo. A sintaxe de uso de um mtodo esttico, a seguinte: <Classe>.<mtodo>, o que nos levaria ao seguinte: PessoaTest.assertEquals(...), sendo que o nome da Classe opcional dentro da mesma Classe. O Eclipse nos ajuda a diferenciar os mtodos estticos, exibindo-os em itlico. Vamos agora executar os testes novamente, usando o boto "Rerun Test":

E ver o que acontece... O que vai nos levar ao seguinte:

Reparem que foram executados 3 de 3 testes. Destes, 2 falharam e um foi bem sucedido. Aquele sobre o mtodo Construtor que acabamos de implementar. Ele foi bem sucedido, pois os valores dos atributos da instncia "p1" da Classe Pessoa, foram atribudos pelo mtodo Construtor conforme o esperado. Usando os mesmos passos, vamos implementar o mtodo de teste para o mtodo "setNome" da nossa Classe Pessoa, obtendo o seguinte:

Executando os testes novamente, vamos obter o seguinte:

65

Agora, 2 dos testes foram bem sucedidos (os que implementamos), apenas um continua falhando. Vamos cuidar dele em seguida. Mais uma vez, usando os mesmos passos, vamos implementar o mtodo de teste para o mtodo "setMaxLivros" da nossa Classe Pessoa. A ttulo de aprendizado, vamos forar um erro, usando um nome de varivel no definido. Teremos o seguinte:

Como a varivel no existe, o assistente do Eclipse no consegue nos ajudar. Vamos agora corrigir o erro, obtendo o seguinte:

Executando os testes novamente, vamos ter:

Mais uma vez, a ttulo de aprendizado, vamos forar um erro no teste do mtodo "setNome", e ver o que acontece:

E executando os testes novamente...

66

Reparem no boto "Compare Actual With Expected Test Result" direita. Se acionado, ele exibe uma janela com as diferenas entre o que era esperado pelo seu teste e o que foi obtido do mtodo sendo testado, assim:

Agora, basta voltar o teste sua condio anterior, onde todos os mtodos passam.

Tudo certo? Ento podemos prosseguir...

67

Aula 06 - "Test-First Development" no Eclipse


TFD ? TDD ? BDD ?

TFD - Test-First Development TDD - Test-Driven Development BDD - Behavior-Driven Development

Qualquer destas siglas, representa basicamente a metodologia de comear o desenvolvimento, no pelo cdigo da funcionalidade propriamente dito, mas sim pela codificao dos testes (ou comportamentos) que vo garantir que a funcionalidade codificada faz o que dela se espera.

como se a codificao dos testes (ou comportamentos) representasse a especificao em cdigo da funcionalidade. E a codificao da funcionalidade vai ento atender exatamente a especificao. Simples assim! No nosso caso, vamos escrever nosso mtodo de teste unitrio antes de escrever o mtodo sendo testado. O Eclipse possui um excelente suporte ao uso de TDD.
O mtodo toString()

Nossa prxima tarefa vai ser sobrepor o mtodo "toString". Vamos revisar algumas de suas caractersticas:

Ele herdado da Classe Object Ele retorna a representao em String de um Objeto Ele normalmente criado para todas as Classes

Vamos voltar nossa pgina de Scrapbook e ver o que este mtodo faz: Preparando o cdigo assim:

68

Que uma vez inspecionado, nos apresenta o seguinte:

Reparem que a nossa Classe Pessoa, est ali identificada (id=47). Mas de forma geral, estas informaes no so muito teis. Isso se d, porque este mtodo herdado da Classe Object, e a Classe Object no "conhece" nada sobre a nossa Classe Pessoa. Em geral, quando criamos uma nova Classe, gostaramos de modificar o mtodo "toString" para melhor representar os objetos da nossa Classe. O que vamos fazer, chamado de "Override" de mtodo, ou seja, vamos "escrever por cima" de um mtodo j existente. No estaremos criando um mtodo novo, mas sim aplicando um novo comportamento um mtodo j existente que a nossa Classe est herdando de Outra.
Aplicando o TDD

Neste ponto, poderamos simplesmente abrir a nossa Classe Pessoa e comear a escrever cdigo novo. No entanto, vamos aplicar a metodologia de TDD, e para isso, vamos recapitular o que esta metodologia prope: 1. 2. 3. 4. 5. Pense sobre o que o mtodo deve fazer. Escreva um caso de teste que vai testar este mtodo. Escreva o novo mtodo. Teste o novo mtodo. Quando o teste passar, teremos concludo.

De volta nossa Classe de teste, vamos escrever um mtodo para testar a nossa verso do mtodo "toString". Mas cumprindo o item 1 da metodologia, vamos pensar em: qual o comportamento desejado para "o nosso" mtodo "toString" ? 1 - Um objetivo prtico, seria que o nosso mtodo "toString" retornasse o nome e o nmero de livros de uma determinada pessoa da seguinte forma:
Romer Simpson (9 livros)

2 - Vamos escrever um caso de teste para isso na Classe "PessoaTest". Estaremos usando as facilidades j vistas anteriormente, obtendo o seguinte resultado:

69

Este mtodo por si s, serve como documentao do nosso mtodo "toString". Se algum alterar o comportamento do nosso mtodo "toString" e esquecer de alterar este teste, ele vai falhar, indicando que a documentao no est mais em conformidade com a implementao. 3 - Vamos agora escrever a nossa verso do mtodo "toString"na Classe "Pessoa". Estaremos mais uma vez usando as facilidades j vistas anteriormente, obtendo o seguinte resultado:

Ao salvar as alteraes, exibida uma tela de alerta indicando que uma parte do cdigo em memria no pode ser atualizado, assim:

Isso ocorre porque o Scrapbook usa o modo Debug do Eclipse, e neste modo as alteraes feitas no cdigo quando salvas, no substituem automaticamente o que est em memria. 4 - O prximo passo, executar os testes e ver o que acontece.

Acionando o boto de comparao dos resultados, podemos ver o seguinte:

70

Fica claro que no definimos corretamente o retorno do mtodo. 5 - A ltima etapa na verdade, um ciclo, onde refatoramos o mtodo at que o teste passe. Vamos corrigir o retorno do mtodo, ficando assim:

Testando novamente, teremos o seguinte:

Todos os testes passaram, e era isso que pretendamos. Observem que existe um alerta na Classe Pessoa, indicando que o nosso mtodo "toString" se sobrepe ao mtodo original, assim:

Fazer uso diretamente dos nomes dos atributos no lugar dos respectivos mtodos get, desta forma:

Pode nos causar restries no futuro. Imaginem a seguinte situao: algum resolve separar o atributo nome nos atributos primeiroNome e sobreNome. Da forma que fizemos, isso iria requerer uma alterao no nosso mtodo toString da Classe Pessoa. J se tivssemos usado os mtodos get desta forma:

71

Bastaria alterar o mtodo "getNome" para:


return primeiroNome + " " + sobreNome;

Mantendo nosso mtodo toString livre de alteraes. Vamos portanto, preferir sempre o uso dos mtodos get evitando alteraes desnecessrias em mtodos que faam uso direto dos nomes dos atributos.

Tudo certo? Ento podemos prosseguir...

72

Aula 07 - Criando a Classe Livro


Um pouco mais de TDD

Nesta aula continuaremos a usar a metodologia TDD. Portanto, iniciaremos criando a Classe de teste para a Classe Livro, e em seguida vamos usar as ferramentas de ajuda instantnea do Eclipse para nos ajudar a criar a Classe Livro propriamente dita. Recapitulando os objetivos da nossa aplicao:

Manter uma lista dos nossos Livros Manter uma lista das Pessoas para as quais emprestamos livros Ser possvel ver quem pegou emprestado qual livro

Neste ponto, ns j temos uma Classe Pessoa capaz de tratar as pessoas para as quais ns emprestamos Livros. Agora ns precisamos da Classe Livro, para tratar dos Livros que possumos. Ento, vamos criar a Classe de teste para ela, assim:

Na janela que apresentada, vamos informar o nome da nossa Classe de teste, deixando o nome da Classe sendo testada vazio, pois ele ainda no existe, claro.

73

O que vai nos levar a isso:

Vamos falar rapidamente sobre a Classe Livro. Quais so os atributos necessrios nossa Classe Livro?

ttulo. (por exemplo: "Menino Maluquinho") autor. (por exemplo: "Ziraldo") Pessoa que possui o Livro. (objeto do tipo Pessoa)

Vamos mais uma vez usar as facilidades do Eclipse para nos ajudar neste processo. Primeiro, vamos criar o mtodo testLivro para testar o mtodo Construtor. Lembre-se: basta comear a digitar o modificador "public" e CTRL+Espao, assim:

74

Preenchendo os espaos adequadamente, teremos:

Vamos seguir adiante usando as facilidades do Eclipse para criar uma instncia da Classe Livro. Para isso, basta digitar "new" e CTRL+Espao, assim:

O que nos apresenta o seguinte resultado:

Mais uma vez, preenchendo os espaos adequadamente, teremos:

75

Reparem que: desta vez o nosso mtodo construtor recebe como parmetro o nome do Livro. Completando com os mtodos de teste propriamente ditos, teremos:

Reparem que a Classe de teste apresenta um erro de compilao. Claro, pois a Classe Livro, ainda no existe. Mas mesmo assim, o Eclipse nos permite executar os testes, ento vamos fazer isso e ver o que acontece, assim:

O Eclipse nos alerta do erro, mas permite prosseguir:

Resultando no seguinte:

Como era de se esperar, l esto os erros indicando a no existncia da Classe Livro. Vamos ver agora, como o Eclipse pode nos ajudar a criar a Classe Livro e todos os seus elementos de sustentao.

76

Comearemos usando o boto direito do mouse sobre o nome da classe com erro, e solicitar a sua criao, assim:

Na janela que apresentada, precisamos alterar a pasta onde a Classe vai ficar localizada, pois o valor default usado o mesmo local da Classe de teste, e no isso que desejamos.

77

Vamos selecionar a pasta padro do nosso projeto, ficando assim:

Gerando o seguinte:

Vamos voltar Classe de teste e cuidar do prximo erro:

Selecionado a opo de criar o mtodo Construtor, teremos:

78

Salvando a Classe Livro alterada, podemos cuidar do prximo erro:

Gerando o seguinte:

Mais uma vez, salvando a Classe Livro alterada, podemos cuidar do prximo erro:

E mais uma vez, selecionado a opo de criar o mtodo Construtor, teremos:

79

E agora, salvando a Classe Livro alterada, os erros se foram:

Agora que a nossa Classe de teste no tem mais erros de compilao, podemos voltar nossa ateno para a Classe Livro propriamente dita, e escrever o nosso mtodo Construtor. Mas reparem, que ao gerar o nosso mtodo Construtor de forma automtica, o Eclipse colocou l um comentrio especial, comeando pela palavra chave "TODO", que indica uma tarefa pendente.

Mais uma facilidade do Eclipse, uma view que exibe todas as tarefas pendentes. Vamos acionla, assim:

O que nos apresenta o seguinte:

80

Vamos ento executar a tarefa pendente e implementar o nosso mtodo Construtor da Classe Livro, assim:

Executando o teste novamente, teremos o seguinte resultado:

Reparem que o nome do autor no o esperado, pois espervamos por "Ziraldo", mas o mtodo construtor gera "Autor Desconhecido" por default. Para corrigir esta situao, devemos poder definir o nome do autor, vamos ento implementar os mtodos get e set que vo nos permitir manipular os atributos da Classe Livro. Para isso, vamos mais uma vez, usar as facilidades que o Eclipse nos d, assim:

Na janela que se abre, vamos selecionar os mtodos get e set para o atributo autor, j para o atributo ttulo, apenas o get, visto que podemos definir o ttulo diretamente no mtodo Construtor, assim:

81

Gerando o seguinte resultado final:

De volta ao nosso mtodo de teste, podemos definir o nome do autor correto, assim:

Executando o teste mais uma vez, teremos:

82

Portanto, vamos revisar como foi criada a Classe Livro usando TDD: 1. 2. 3. 4. 5. 6. Criar a classe LivroTest Criar o mtodo testLivro() para testar o construtor Usar os facilitadores do Eclipse para criar a Classe Livro Usar os facilitadores do Eclipse para criar os mtodos get e set Alterar o teste para definir o valor correto ao atributo autor Executar com sucesso o mtodo de teste

Tudo certo? Ento podemos prosseguir...

83

Aula 08 - Adicionar Pessoa Classe Livro


Uso contnuo de TDD

Objetivos desta aula:


Neste momento temos as Classes Pessoa e Livro Precisamos mostrar qual Pessoa possui um determinado Livro emprestado com algum Vamos portanto, criar um relacionamento entre Livro e Pessoa

Vamos continuar a usar a metodologia TDD. Para isso, executaremos os seguintes passos: 1. Criar um mtodo de teste do relacionamento (testGetPessoa) na Classe de teste da Classe Livro (LivroTest) 2. Implementar o mtodo de relacionamento (getPessoa) na Classe Livro 3. Executar o teste Ns j temos uma Classe Pessoa capaz de tratar as Pessoas para as quais emprestamos Livros. Como j foi explicado, vamos comear na Classe de teste da Classe Livro (LivroTest). Nela, vamos criar o mtodo "testGetPessoa" da maneira com a qual j estamos acostumados (usando os facilitadores do Eclipse), assim:

Neste mtodo, vamos criar um objeto do tipo Livro e outro do tipo Pessoa, assim:

Em seguida, usamos um novo mtodo para definir para quem o Livro vai ser emprestado, e preparamos o teste do mesmo, da seguinte forma:

84

Reparem nos indicativos de erro em relao ao fato de o mtodo "setPessoa" ainda no existir.

Como estamos lidando com um treinamento aqui, e considerando que comparar objetos em Java um tanto mais complicado. Ao invs de verificar se o objeto Pessoa retornado pelo mtodo "getPessoa" igual ao objeto p2 definido anteriormente, vamos comparar apenas os nomes, assumindo que cada Pessoa tem um nome nico. Na sequencia, vamos usar o "Quick Fix" do Eclipse para criar estes mtodos, posicionando o mouse sobre o erro e selecionando a opo "Create method":

Obtendo o seguinte resultado:

Seguindo o mesmo procedimento para o mtodo "get" teremos o seguinte:

85

Salvando todo o trabalho, a nossa Classe de teste no ter mais erros:

Vamos agora completar o contedo real dos mtodos criados. Primeiro o mtodo set:

Reparem que o Eclipse alerta de que o campo "pessoa" no est definido na Classe Livro. Mais uma vez, vamos usar o "Quick Fix" do Eclipse para corrigir isso, selecionando a opo "Create field", obtendo o seguinte:

O que indica ter sido criado o campo "pessoa" do tipo (Classe) "Pessoa". A diferena sutil, apenas uma letra maiscula ou minscula distingue o nome de um campo do nome de uma Classe. Notem tambm que o Eclipse criou o campo "pessoa" usando a palavra "private" no incio de definio. As palavras "private", assim como "public", neste contexto, so chamados "modificadores de acesso", indicando o escopo de abrangncia do objeto sendo definido. No caso, o nosso campo "pessoa" vai ser "visvel" apenas dentro do escopo desta Classe onde ele est sendo criado. 86

Modificadores de Acesso

Em Java existem 4 modificadores de acesso: 1. public - o objeto acessado de qualquer Classe ou Subclasse 2. private - o objeto acessado apenas na Classe em que foi criado 3. sem modificador - o objeto acessado apenas por Classes dentro do "pacote" em que foi criado 4. protected - o objeto acessado de qualquer Classe ou Subclasse dentro do "pacote" em que foi criado Sabendo disso, e se queremos que estes campos estejam disponveis para outras Classes deste "pacote" vamos retirar os modificadores de acesso, ficando assim:

Vamos agora completar o mtodo get, retornando o objeto do tipo Pessoa j definido para a Classe Livro:

Salvando tudo que foi feito at aqui, estamos prontos para executar o nosso teste. Desta vez, podemos experimentar a combinao de teclas de atalho do Eclipse para este fim. Voc pode estar com outra Classe aberta na rea de edio, contanto que a Classe cujos testes voc deseja executar esteja selecionada no "Package Explorer", assim:

Usando a combinao de teclas: Alt + Shift + X, T, os testes de JUnit sero executados sobre a Classe que estiver selecionada no "Package Explorer". O que neste caso, vai nos dar o seguinte resultado: 87

Recapitulando o que vimos at agora:


As Classes Pessoa e Livro, esto relacionadas A Classe Livro depende da Classe Pessoa Este relacionamento de "Um para Um" (um livro s pode ter um leitor por vez)

Refatorao

Vamos aproveitar para falar um pouco sobre "refactoring". Pois no podemos esquecer ele, um dos passos da metodologia TDD que estamos aplicando aqui.

comum a todo artista durante o desenvolvimento da sua obra, tentar melhorar o resultado final. Reescrever um cdigo que j funciona com o intuito de melhor-lo faz parte da "arte de programar". Desculpem-me alguns gerentes de projeto, mas prefiro tratar os bons desenvolvedores como "artistas" do que como "operrios". Podemos dar aqui um exemplo bem simples de refatorao. Voltando nossa Classe LivroTest, reparem no seguinte trecho de cdigo:

Ele possui algumas deficincias tais como: Uso de variveis desnecessrias e nomes no representativos (quem est com o livro no necessariamente o seu dono). Primeiro vamos comentar o cdigo atual que vamos refatorar usando o atalho: CTRL + Shift + C, lembrando que ele do tipo on/off, ou seja, cada vez que acionado, comenta ou descomenta o trecho de cdigo selecionado:

88

Vamos refazer este trecho da seguinte forma:

Salvando tudo e executando os testes novamente, devemos ter o mesmo resultado de sucesso de antes. E assim sendo, podemos remover o cdigo anterior que foi comentado, ficando assim:

Vamos entender um pouco mais sobre a linha de cdigo que acabamos de implementar:
String quemPegouLivro = l2.getPessoa().getNome();

Nela, estamos atribuindo varivel do tipo String "quemPegouLivro", o nome da Pessoa. Mas como?

Primeiro, usamos o mtodo "getPessoa" para obter uma instncia do objeto do tipo Pessoa a qual o livro est vinculado. Depois, sobre a pessoa recuperada, aplicamos o mtodo "getNome", para obter o nome da pessoa

Neste momento, ns temos duas Classes de teste: PessoaTest e LivroTest, e vamos criar mais. Seria conveniente ter uma forma de executar todos os testes de uma s vez. Podemos obter isso criando uma nova Classe de teste que agregue as demais.
Suite de testes

Podemos agregar vrias Classes de teste, criando uma "Suite" de testes, da seguinte forma: Boto direito do mouse sobre o nosso pacote de testes New Other.

89

E na janela que se abre, vamos selecionar agora "JUnit Test Suite":

A prxima janela, nos permite especificar as caractersticas da nossa Suite de testes. J so exibidos valores default, e entre eles podemos ver que as Classes de teste j existentes, esto selecionadas. Vamos aceitar estes valores default e finalizar:

90

Obtendo o seguinte:

Sem entrar em maiores detalhes aqui, fica claro que medida que novas Classes de teste forem criadas, basta incluir novas linhas relativas a elas na nossa Suite de teste. Mais uma vez, estando com a Classe da nossa Suite de testes selecionada no "Package Explorer", vamos usar a combinao de teclas: Alt + Shift + X, T.

Obtendo agora o seguinte resultado:

Reparem que agora, executando os testes a partir da nossa Suite de testes, todos os mtodos de teste de todas as nossas Classes de teste so executados de uma s vez.

Tudo certo? Ento podemos prosseguir...

91

Aula 09 - Listas e ArrayList


Listas na nossa aplicao

O que temos at agora?


Ns criamos a Classe Pessoa Ns criamos a Classe Livro Ns estabelecemos uma ligao entre estas Classes criando um campo pessoa na Classe Livro

Agora vamos juntar tudo isso e comear a pensar na nossa Classe Biblioteca. Mas o que gostaramos que a Classe Biblioteca fizesse?

Listar os livros que possumos Listar as pessoas que pegaram nossos livros emprestados Listar quantos livros e pessoas existem no nosso grupo?

Num primeiro momento podemos estimar a nossa Biblioteca comunitria em cerca de 50 pessoas e 100 livros. Mas difcil de garantir. Vamos supor que um amigo entre no grupo e que apenas ele disponha de 200 livros. L se vai a nossa mdia por gua a baixo. O ideal portanto, que o nosso programa possa lidar com um nmero ilimitado de livros e pessoas. No por acaso, a linguagem Java possui algumas Classes criadas para lidar com listas. Ns vamos usar uma delas chamada: ArrayList.
Caractersticas de um ArrayList

Pode lidar com um nmero qualquer de Objetos numa lista Possui mtodos j construdos para gerenciar a lista

Vamos voltar a usar o Scrapbook para nos familiarizar com a Classe ArrayList.

Abrindo o Scrapbook, se existir algum cdigo anterior, podemos exclu-lo:

92

A Classe ArrayList est no pacote "java.util". Portanto, a primeira coisa a fazer : importar este pacote para o Scrapbook:

Na janela que se abre...

Em seguida:

E na sequncia:

O fato de importar o pacote "java.util", significa que podemos digitar simplesmente "ArrayList" em vez de "java.util.ArrayList" no nosso cdigo. 93

O nosso prximo passo, vai ser criar um ArrayList. Fazemos isso usando o comando "new" que a essa altura j conhecemos. sempre usando os facilitadores do Eclipse. Sobre este assunto, cabe aqui uma dica. Aparentemente, nas verses mais recentes do Eclipse, o assistente de cdigo no est funcionando para o comando "new" no Scrapbook. Para solucionar este problema, siga os seguintes passos: Window Preferences Java Editor Templates. Localize o item "new", assim:

Edite este template e altere o contexto de "Java statements" para "java".

Clique "OK".

94

E "OK" novamente. Isso deve fazer funcionar o "code complete" para o comando new no Scrapbook.

Comeamos criando uma lista vazia, assim:

95

Onde o construtor "<String>", define para o compilador que a nossa lista s vai poder conter Objetos do ipo String. Se tentarmos colocar qualquer outro tipo de Objeto na lista, vamos receber um erro de compilao. Caso no especificado este construtor, a lista dar suporte a qualquer tipo de Objeto Java. Mas esta no a forma mais comum de uso. Vamos agora adicionar elementos na nossa lista usando o mtodo "add", assim:

E verificar o resultado com o "Inspect", assim:

Convm ressaltar que os ndices das listas em Java comeam com 0 (zero). A ttulo de aprendizado, vamos tentar adicionar um Objeto do tipo inteiro nossa lista.

Resultando em um erro, assim:

96

Aplicando a Classe ArrayList

Agora que j estamos familiarizados com a Classe ArrayList, vamos us-la tratar os nossos livros e pessoas. Vamos comear com a Classe Livro, assim:

Inspecionando, vamos ver os livros na nossa lista:

Seguindo adiante, vamos criar uma pessoa e associar esta pessoa a um dos livros:

97

Mais uma vez, inspecionando vemos que agora existe uma pessoa associada ao livro l1:

Podemos observar aqui, a hierarquia dos Objetos envolvidos: A nossa lista (ArrayList), contm l1 (Livro) que por sua vez contm p1 (Pessoa). Agora, vamos ver mais detalhadamente alguns outros mtodos da Classe ArrayList. Localizando um elemento (o primeiro) da lista:

Inspecionando, vamos obter o Objeto livro esperado:

98

Usando a hierarquia vista anteriormente, podemos obter a pessoa associada diretamente do Objeto livro recuperado:

E assim:

Seguindo usando o mesmo princpio, j que obtivemos um Objeto do tipo Pessoa, podemos recuperar o nome da pessoa diretamente dele, assim:

Inspecionando, teremos um String com o nome da pessoa:

99

Portanto, nesta linha de cdigo:


lista.get(0).getPessoa().getNome()

lista.get(0) - retorna o livro l1 getPessoa() - retorna a pessoa p1 getNome() - retorna o String com o nome da pessoa p1

Vamos agora localizar um determinado livro na lista, usando o mtodo "indexOf":

O que vai nos retornar a localizao do Objeto l2 na lista:

Sendo ele o segundo elemento da lista (ndice igual a 1), lembrando que o primeiro elemento da lista possui ndice igual a 0 (zero). Resumindo: se sabemos o ndice, podemos obter o Objeto. Se sabemos o Objeto, podemos obter o ndice. Isso tambm se aplica ao uso do mtodo "remove".

100

Vamos us-lo para remover o Objeto l1 da lista:

Inspecionando, podemos ver que a nossa lista agora possui apenas um Objeto do tipo Livro, e que ele no l1 e sim o l2, pois o l1 acabou de ser removido:

Agora que sabemos como inserir, localizar e excluir elementos de uma lista, podemos comear a usar estas listas nas nossas aplicaes. o que vamos fazer na prxima aula.

Tudo certo? Ento podemos prosseguir...

101

Aula 10 - Classe Biblioteca


Library e Biblioteca

A palavra "Library" no mundo Java define um conjunto de pacotes. Poderia haver alguma confuso de nomes se estivssemos trabalhando em Ingls, pois Classe que vai representar os Livros que temos e as Pessoas que podem pegar os livros emprestados, deveria tambm se chamar "Library". Mas, como aqui, estamos usando nomes em Portugus, no h nenhum problema de confuso entre "Library" e "Biblioteca", que vai ser o nome da nossa Classe. Vamos continuar a usar a metodologia TDD. Portanto:

O nome da nossa Classe de Teste vai ser "BibliotecaTest". E vamos deixar o nome da Classe sendo testada em branco, pois ela ainda no existe.

Obtendo o seguinte:

102

Vamos primeiramente criar o mtodo de teste do Construtor da Classe. Sempre usando os facilitadores do Eclipse:

Aqui vamos usar um novo tipo de teste. o "assertTrue". O objetivo aqui, vai ser verificar se a nossa instncia da Classe Biblioteca, possui um ArrayList contendo Livros e outro contendo Pessoas. Dessa forma:

Desta forma, sabemos que o nosso mtodo Construtor da Classe Biblioteca, alm de criar a instncia da nossa Biblioteca, vai precisar tambm adicionar a ela uma lista de Livros e outra de Pessoas. Vamos prosseguir usando o "Quick Fix" do Eclipse para nos ajudar a criar a Classe para atender a este Teste. Posicionando o mouse sobre o erro, temos:

103

Escolhendo a opo de Criao da Classe...

Na janela que se apresenta, precisamos lembrar de alterar o nome da pasta onde a Classe ser criada para "src". Feito isso, teremos o seguinte:

A seguir, ainda usando o "Quick Fix" do Eclipse, vamos criar o Construtor da Classe:

104

Gerando o seguinte:

Vamos prosseguir usando o "Quick Fix" do Eclipse para solucionar os problemas apontados na nossa Classe de teste, e ao mesmo tempo ir completando a nossa Classe Biblioteca.

Primeiro o campo "nome".

105

Em seguida, devemos nos preocupar com os campos "livros" e "pessoas", mas reparem que ambos so do tipo "ArrayList", e este tipo no est sendo reconhecido pelo compilador. A soluo para isso simples, basta importar o pacote java.util que contm este tipo de dado.

Fazendo conforme indicado, o pacote importado para a nossa Classe de teste e o erro desaparece.

Agora o campo "livros".

106

No esquecendo que para que os erros desapaream da Classe de teste, a Classe Biblioteca deve ser salva a cada alterao. E tambm que alguns desses erros, s desaparecerem, se a prpria Classe de teste for salva. Da mesma forma, vamos fazer para o campo "pessoas".

Neste momento, com todo o trabalho feito at aqui j salvo, no h mais erros de compilao no projeto.

Lembrando tambm, que existe uma outra forma de acessar os problemas e advertncias para trat-los. a aba "Problems", geralmente localizada na parte inferior da janela do Eclipse.

107

Neste ponto, ns estamos aptos a completar o mtodo construtor da Classe Biblioteca. Antes disso, no entanto, vamos cuidar para que os campos da Classe Biblioteca possam ser acessados por outras Classes dentro do mesmo pacote. Para isso, como j mencionado anteriormente, basta remover o modificador "public" da definio dos campos, assim:

Com isso, a nossa Classe de teste pode acessar estes campos da forma correta, mas classes fora deste pacote, no podem. A prxima interveno em relao aos campos, atender os alertas, e definir que tipo de Objeto vai ser tratado em cada uma das Listas. Para isso, vamos usar a aba "Problems" j citada, selecionar uma das linhas, acionar o boto direito do mouse e selecionar "Quick Fix", assim:

Na janela que se abre, selecionamos as duas linhas com este mesmo problema, e escolhemos o ajuste "Add type arguments to ArrayList", assim.

108

Com isso, temos o problema parcialmente resolvido:

Mas precisamos substituir os pontos de interrogao pelos tipos de Objetos realmente desejados, assim:

Podemos agora ajustar o Construtor propriamente dito, comeando pelo nome do campo de parmetro, de "string" que foi gerado automaticamente para "nome", que bem mais apropriado.

109

Em seguida, vamos atribuir o parmetro "nome" recebido, ao atributo "nome" da instncia que estiver sendo criada, assim:

O prximo passo, criar os atributos de Livros e Pessoas da instncia no formato de Listas, assim:

Existem algumas caractersticas que devem ser ressaltadas nestas duas linhas.
livros = new ArrayList<Livro>(); pessoas = new ArrayList<Pessoa>();

Quando chamamos o Construtor de um "ArrayList" usando o comando "new", e especificamos o tipo do Objeto especfico que queremos usando o parmetro de tipo "<Tipo>", necessrio o uso de () para finalizar o construtor de ArrayList, pois ele no possui parmetros. Portanto, a sintaxe do construtor nesses casos, a seguinte:
new TipoGenrico<TipoEspecfico>();

Outra observao importante, em relao declarao dos campos a nvel da Classe. Campos declarados na Classe, no devem ser declarados novamente nos mtodos da Classe, pois na verdade, estariam sendo declaradas novas variveis, locais aos mtodos, podendo causar muita confuso. A ttulo de aprendizado, vamos ver o que ocorre se isso for feito.

110

Reparem que gerado um alerta para o fato de a varivel local "livros" no ter sido usada no escopo do mtodo. Este um erro muito comum de acontecer com iniciantes em Java, portanto, vamos evit-lo, certo? Com a nossa Classe Biblioteca criada, hora de executar o nosso teste, e ver o que acontece.

Se tudo correu bem, o teste deve passar:

Um detalhe que deve ser observado em relao aos testes de JUnit, que os nomes dos mtodos de teste devem comear por "test". Mais uma vez, a ttulo de aprendizado, vamos ver o que ocorre se isso no for feito.

111

Com o nome do mtodo alterado desta forma, e executando o teste novamente, teremos:

Reparem no alerta dizendo que no foi encontrado nenhum teste na Classe. Tudo por conta do nome fora do padro esperado. Fiquem atentos! Uma ltima observao a respeito dos testes: eles podem nos ajudar saber de antemo, qual tipo de dado suportado por cada mtodo. Sabemos que os livros de uma Biblioteca so do tipo ArrayList. O que acontece se algum tentar adicionar um livro usando um tipo de dado diferente do esperado?

Reparem que gerado um erro de compilao justamente dizendo que o mtodo no se aplica ao tipo de dado passado como parmetro, pois ele esperava um "ArrayList" e foi passado um "String".

Tudo certo? Ento podemos prosseguir...

112

Aula 11 - Primeiros Mtodos da Classe Biblioteca


Que Mtodos precisamos na Classe Biblioteca?

Existem alguns mtodos na Classe Biblioteca, cuja necessidade, chama a ateno. So eles:

Mtodos "get" para os campos(mtodos "set" no so necessrios) Mtodos addLivro e addPessoa Mtodos removeLivro e removePessoa Mtodos pegarLivro e devolverLivro Mtodo getLivrosDisponiveis Mtodo getLivrosEmprestados Mtodo getLivrosPessoa

Para providenciar o que est faltando, vamos continuar a usar a metodologia TDD, e os facilitadores do Eclipse. Sendo assim, nossa primeira ao vai ser criar os mtodos "get" para os seguintes campos:

Uma das formas de se conseguir isso, : com a Classe Biblioteca selecionada.

Na barra de menus selecionar: Source Generate Getters and Setters... Na janela que apresentada, expandir os campos e selecionar apenas os mtodos que necessitamos:

113

Obtendo o seguinte:

Aprendendo e aplicando um pouco mais sobre a metodologia TDD, aps qualquer modificao como a que acabamos de fazer, uma boa hora de reexecutar os testes para garantir que as nossas alteraes no tenham gerado nenhum erro. A palavra de ordem : "Ficou em dvida, reexecute os testes". Portanto, vamos fazer isso. Mais uma vez, uma das formas de se fazer isso, : com a Classe BibliotecaTest selecionada.

Na barra de menus selecionar: Run Run As JUnit Test. Obtendo o seguinte:

114

Como era de se esperar, os testes continuam passando, afinal era uma alterao bem pequena e foi feita usando um dos facilitadores do Eclipse, mas serve para exercitar o uso de TDD. O nosso prximo passo ser escrever um mtodo de teste para os mtodos responsveis por adicionar e remover Livros. No entanto, ns vamos precisar de alguns objetos para efetuar estes testes.

Objetos do tipo Livro Objetos do tipo Pessoa Um Objeto do tipo Biblioteca

Para evitar duplicidade de cdigo, pois estes objetos podem ser teis em outros mtodos que ainda vo ser criados, existe no JUnit o mtodo "setUp()", que como o nome indica usado para inicializar o nosso procedimento de teste com tudo que for necessrio. Na verdade, existem alguns "mtodos padro" costumeiramente usados no s na inicializao, como tambm na finalizao e nos prprios testes com JUnit
oneTimeSetUp() setUp() testEmptyCollection() tearDown() setUp() testOneItemCollection() tearDown() oneTimeTearDown()

Mas isso assunto para um curso mais avanado. No momento, vamos abrir a nossa Classe de teste "BibliotecaTest", e cri-lo, assim:

Mas existe um problema com esta implementao. Ocorre que as variveis: l1, l2, p1, p2 e b1, so locais ao mtodo setUp. Desta forma, elas no estariam disponveis para os demais mtodos da nossa Classe de Teste.

115

A soluo para isso, simples: basta passar a definio das variveis para o escopo da Classe, transformando-as em "campos". E mais uma vez, o Eclipse nos ajuda nesta tarefa com um dos seus facilitadores. bom que se tenha em mente, que em geral, o Eclipse os d ao menos trs formas diferentes para obter um determinado resultado: Um usando a barra de menus, outro usando o menu de contexto no prprio cdigo fonte e um terceiro usando teclas de atalho. Neste caso especfico, vamos ver cada um deles. Comeando pelo menu de contexto no cdigo: Com a varivel l1 selecionada, acionar o boto direito do mouse sobre ela e no menu de contexto, selecionar: Refactor Convert Local Variable to Field...

Na tela que se abre em seguida, aceitar os valores default e acionar o boto OK.

116

Obtendo o seguinte:

Agora, usando a barra de menu: Com a varivel l2 selecionada, na barra de menus selecionar: Refactor Convert Local Variable to Field...

Na tela que se abre em seguida, aceitar os valores default e acionar o boto OK.

117

Obtendo o seguinte:

Finalmente, usando as teclas de atalho: Com a varivel p1 selecionada, acionar: Alt + Shift + T. Isso faz surgir direto o menu de contexto especfico de Refatorao, no qual basta selecionar: Convert Local Variable to Field..., ou simplesmente usar a tecla "v".

Na tela que se abre em seguida, aceitar os valores default e acionar o boto OK.

118

Obtendo o seguinte:

Fazendo o mesmo para as variveis: p2 e b1, usando, dos mtodos expostos o que voc julgar mais cmodo, obteremos o seguinte:

uma dvida frequente dos iniciantes neste ponto, querer saber qual a diferena entre uma Varivel e um Campo? Como vimos nos procedimento acima, todos so Variveis, s que: aquelas variveis definidas a nvel da Classe, so tambm chamadas de Campos (Fields), apenas nomenclatura. Feito isso, podemos agora criar o nosso novo mtodo de teste para a incluso de Livros. Mais uma vez, usando os facilitadores do Eclipse, inicie a construo do mtodo pela inicializao dos objetos necessrios, assim:

119

Em seguida, precisamos garantir que o objeto principal do nosso teste esteja vazio, assim:

O prximo passo, adicionar livros na nossa biblioteca, assim:

Ocorre que: o mtodo "addLivro" ainda no existe. Vamos usar o auxlio do Eclipse para a correo de erros que aparece na imagem acima, e criar o mtodo (vazio por enquanto) na Classe Biblioteca, assim:

120

Uma vez adicionados os Livros, devemos garantir que o objeto no est mais vazio e possui 2 (dois) itens, assim:

Alm disso, devemos garantir que os ndices dos objetos so os esperados, assim:

O prximo passo, testar da mesma forma os efeitos do mtodo "removeLivro". Na situao atual, se removemos um dos Livros da Biblioteca, deve restar apenas 1, portanto:

Neste momento, o mtodo "removeLivro", no existe. Vamos usar o mesmo procedimento j usado anteriormente, para criar este mtodo vazio (por enquanto), na Classe Biblioteca, obtendo o seguinte:

Alm dos testes j efetuados, podemos ainda garantir que o ndice do segundo Livro, passou a ser 0 (zero), lembrando que: quando havia dois objetos do tipo Livro, o primeiro tinha ndice 0 121

(zero) e o segundo o ndice 1 (um). Agora que retiramos o primeiro Livro, o ndice do segundo Livro deve passar a ser 0 (zero). Vamos verificar isso, desta forma:

Para finalizar, vamos fazer de forma semelhante o teste dos efeitos de remover o Livro que havia sobrado, assim:

Devemos ter voltado situao inicial, ou seja, o objeto deve estar vazio. chegada a hora de implementar os mtodos que vo cuidar de adicionar e remover os Livros, na Classe Biblioteca, assim:

Agora, devemos usar exatamente os mesmos procedimentos para criar os mtodos para adicionar e remover Pessoas, usando claro a metodologia TDD e comeando pelos seus respectivos testes. Sendo assim, o mtodo de teste deve ficar assim:

122

E os mtodos implementados na Classe Biblioteca, devem ficar desta forma:

Com todos os mtodos prontos, devemos executar novamente os testes, neste momento, o ideal que a nossa suite de testes seja alterada incluindo a classe "BibliotecaTest", assim:

Com a nossa Suite de testes (AllTests) alterada desta forma, podemos testar toda a aplicao e devemos obter sucesso, assim:

Podemos verificar neste momento, usando a Viso "Outline", que a Classe Biblioteca j possui vrios mtodos implementados:

123

Mais alguns vo ser implementados em breve.

Tudo certo? Ento podemos prosseguir...

124

Aula: 12 - Os mtodos de Emprstimo e Devoluo


Afinal isso que uma Biblioteca faz

Agora que temos os mtodos bsicos da Classe Biblioteca criados, vamos implementar a parte de Emprstimo e Devoluo de Livros. Estes mtodos vo ver um pouco mais complexos do que os que fizemos at aqui. Prosseguindo no uso da metodologia TDD, vamos criar um mtodo de teste para tudo isso, assim: testMovimentaLivro

Ele vai testar os mtodos de Emprstimo e Devoluo o Empresta um Livro o Empresta um segundo Livro o Devolve um Livro o Devolve um segundo Livro o Comandos de verificao depois de cada chamada de mtodo

Planejamento e Design

Como j foi mencionado, estes mtodos vo ser um pouco mais complexos, portanto, vamos cuidar do seu planejamento e design antes de comear a codificar. Vamos estabelecer agora as caractersticas do nosso mtodo de Emprstimo.

Deve estabelecer o objeto Pessoa no campo pessoa do Livro Usando o mtodo setPessoa O que acontece se o Livro j foi emprestado? o No deve permitir o emprstimo Precisa testar isso no prprio mtodo de Emprstimo O mtodo deve indicar sucesso ou falha de acordo com a situao Devemos informar ao mtodo chamador se o emprstimo foi bem sucedido ou no

Sabendo de tudo isso, vamos detalhar em Pseudo cdigo, o que o mtodo de Emprstimo deve fazer: 1. Garantir que o Livro ainda no foi emprestado. 2. Se ainda no foi emprestado, atribuir uma Pessoa para o Livro e retornar para o mtodo chamador que o emprstimo foi bem sucedido. 3. Caso contrrio, simplesmente retornar ao mtodo chamador que o emprstimo no ocorreu. Agora que sabemos o que o mtodo deve fazer, vamos estabelecer o "como" ele vai fazer, definindo a sua assinatura: 1. Vai retornar um booleano (true ou false), indicando sucesso ou falha. 2. No Pseudo-Cdigo, foi mencionado "uma Pessoa para o Livro". Mas qual Pessoa e qual Livro? 3. Livro e Pessoa portanto, vo ser parmetros do nosso mtodo. 125

Sendo assim, a assinatura do mtodo seria esta:


public boolean emprestimo(Livro li, Pessoa pe)

Com tudo isso em mente, podemos iniciar a construo do nosso mtodo de teste, na Classe BibliotecaTest.

Nada de novo aqui. Usando os facilitadores do Eclipse, estamos prontos para comear.

Os primeiros passos, vo ser: Inicializar os objetos, com o j conhecido mtodo setUp(). E adicionar Livros e Pessoas Biblioteca, assim:

Neste ponto, vamos usar uma sintaxe um pouco diferente do mtodo assertTrue do JUnit. De forma que: caso o retorno do mtodo sendo testado seja falso, uma mensagem seja exibida, assim:

126

Lembrando que o mtodo "emprestimo", que ainda vamos criar, retorna um valor booleano, indicando se a operao foi bem sucedida ou no. Depois disso, supondo que o emprstimo tenha sido bem sucedido, devemos verificar se o nome da Pessoa atribudo ao Livro, o que se espera, assim:

Lembrando aqui, que devemos recuperar o nome da Pessoa, e no comparar com o objeto Pessoa simplesmente. Como j foi mencionado, comparar dois objetos em Java pode ser enganador... Tambm supondo que o emprstimo foi bem sucedido, podemos nos certificar que: uma tentativa de emprestar o mesmo livro vai falhar, usando agora o mtodo assertFalse do JUnit. De forma que: caso o retorno do mtodo sendo testado seja verdadeiro, uma mensagem seja exibida, assim:

Guarde na memria:

assertTrue - d certo se o mtodo sendo testado retorna true. Caso contrrio, emite a mensagem. assertFalse - d certo se o mtodo sendo testado retorna false. Caso contrrio, emite a mensagem.

127

Com tudo isso, o mtodo de Emprstimo est razoavelmente bem criticado. Usando a mesma tcnica e os mesmo dados, vamos fazer as verificaes para o mtodo de Devoluo, assim:

Reparem que o mtodo de Devoluo, s precisa receber o Livro como parmetro. O prximo passo, usar o "Quick Fix" do Eclipse para nos ajudar a criar os mtodos que precisamos:

O que nos leva a isto:

Fazendo o mesmo para o mtodo de Devoluo:

128

Teremos:

Neste ponto, estamos aptos a implementar os mtodos de Emprstimo e Devoluo propriamente ditos. Mas para isso, devemos considerar alguns detalhes Por exemplo: o mtodo de Emprstimo, vai precisar atribuir uma Pessoa a um Livro, mas apenas se o Objeto Pessoa estiver vazio (null). Desta forma:

Aqui surgem algumas informaes novas, que precisamos comentar.


O comando if, que de uso frequente, e portanto precisa ser bem estudado. O operador de igualdade ==, que no deve ser confundido com o de atribuio =. Um erro frequente entre os iniciantes. O Literal1 null, que define um Objeto2 vazio. Notas:

1. Diferente do que muitos imaginam, "null" no uma palavra reservada. um Literal. 2. Entenda-se qualquer Objeto: um Campo, uma Varivel, ou a instncia de uma Classe. Referncias:

O comando if. O operador de igualdade. O literal null.

129

Portanto, com a expresso:


if (l1.getPessoa() == null)

Estamos verificando se no h nenhuma Pessoa atribuda ao Livro "l1". O cdigo do mtodo de Devoluo, vai ser muito semelhante, assim:

Nada de novo aqui, a no ser:

O operador de diferente !=.

Neste caso, com a expresso:


if (l1.getPessoa() != null)

Estamos constatando que j existe uma Pessoa atribuda ao Livro "l1". Agora, estamos prontos para testar tudo que fizemos at agora. Como as modificaes foram feitas apenas na Classe Biblioteca, podemos executar apenas os testes da Classe correspondente: BibliotecaTest. Desta vez, com a Classe de Teste selecionada:

Vamos usar o atalho: Alt + Shift + X + T. Se tudo correu bem e no houve erros de digitao, o teste deve passar:

130

Assim, os nossos mtodos de Emprstimo e Devoluo esto prontos para evoluir.

Tudo certo? Ento podemos prosseguir...

131

Aulas: 13 e 14 - Evoluido os mtodos de Emprstimo e Devoluo


Melhorando os mtodos de Emprstimo e Devoluo

A essa altura, poderamos pensar que o nosso mtodo de Emprstimo, est pronto. Mas ser que est mesmo? Algum lembra que existe um limite de Livros que uma Pessoa pode pegar emprestado? Na Classe Pessoa, ns havamos criado o campo maxLivros, com a finalidade de limitar o nmero de Livros que uma Pessoa pode pegar emprestado simultaneamente.

No entanto, ns no tratamos disso no mtodo de emprstimo nem nos seus respectivos testes. Lembrou? Ento vamos cuidar disso. Mais uma vez, usando TDD, vamos comear pelos testes. Vamos incluir mais alguns testes no mtodo testMovimentaLivro da Classe BibliotecaTest. Desta forma:

O primeiro teste com assertTrue, garante que eu devo conseguir emprestar o Livro "l2" para a Pessoa "p1". J o segundo teste com assertFalse, garante que eu no devo conseguir emprestar o Livro "l1" para a mesma Pessoa "p1", pois o seu limite de Livros emprestados (1 no caso) foi atingido. Se neste momento, executarmos os testes, eles devem falhar, pois ns no alteramos o mtodo de Emprstimo para levar em considerao o limite de Livros. Vamos confirmar isso (Alt + Shift + X + T):

132

Realmente, como era de se esperar, os testes falham. E emitida a mensagem de Emprstimo indevido, pois como ns ainda no implementamos um tratamento para o limite de Livros, o mtodo conseguiu emprestar mais um Livro para a mesma Pessoa mesmo com o limite sendo excedido. Agora, para que possamos testar se o nmero mximo de Livros que uma Pessoa pode pegar emprestado foi atingido, precisamos antes de mais nada saber, quantos livros aquela Pessoa j havia pego emprestado. Fica clara a necessidade de um mtodo getLivrosPorPessoa. Tendo este mtodo, seria bastante simples obter a quantidade de Livros, desta forma:
quantidade = b1.getLivrosPorPessoa(p1).size();

Mas vamos manter o padro, e comear pelos testes:

Agora reparem naquelas 4 linhas do mtodo testMovimentaLivro, ns j as havamos usado mais acima, e vamos precisar usar novamente neste novo mtodo. Isso chamado de: redundncia de cdigo. Para evitar esse tipo de situao, assim que uma repetio de um determinado trecho de cdigo detectada, devemos procurar transformar o contedo deste trecho, num mtodo parte. mais um caso de Refatorao de Cdigo, como vimos no item 12, aula 08. Nesses casos, mais uma vez, os facilitadores do Eclipse nos ajudam. Com as linhas que nos interessam selecionadas, na barra de menus, selecionar: Refactor Extract Method..., ou usar o atalho: Alt + Shift + M.

133

Na Janela que se abre, especificar o nome desejado para o mtodo, assim:

Isso faz com que todas as ocorrncias daquelas linhas sejam substitudas pela chamada do novo mtodo que foi automaticamente criado pelo Eclipse. Desta forma:

Agora, com o mtodo addItems criado, podemos fazer uso dele no nosso novo mtodo de teste:

134

Prosseguindo na implementao, vamos fazer os testes, na seguinte sequncia:


Garantir que no incio, a Pessoa "p1" no tenha pego nenhum Livro. Emprestar o Livro "l1" para a Pessoa "p1". Verificar se o tamanho da Lista de Livros da Pessoa "p1", o esperado. Verificar se o ndice do Livro "l1" na Lista de Livros o esperado. Emprestar o Livro "l2" para a Pessoa "p1". Verificar se o tamanho da Lista de Livros da Pessoa "p1", o esperado. Verificar se o ndice do Livro "l2" na Lista de Livros o esperado.

O que vai nos levar ao seguinte:

Aqui, usamos mais uma vez o recurso de Lista (ArrayList). Prosseguindo, vamos usar novamente o Quick Fix do Eclipse para criar o mtodo.

135

Finalizando os mtodos de Emprstimo e Devoluo

O mtodo getLivrosPorPessoa, ser implementado da seguinte forma:

A qual, merece algumas explicaes. Vamos ver linha a linha: 64. Define o ArrayList resultado que vai armazenar a Lista que o mtodo deve retornar. 65. Um lao do tipo "foreach", que vai percorrer a lista de Livros. 66. O "if" que define as condies que vo eleger um elemento para a nossa Lista. o O Livro deve estar emprestado a uma Pessoa. o O nome da Pessoa a qual o Livro foi emprestado deve ser igual ao da Pessoa passada como parmetro 68. O elemento eleito adicionado na Lista. 71. O ArrayList "resultado" retornado. Como funciona o lao "foreach"? 1. 2. 3. 4. 5. Coloca o primeiro Livro da lista "this.getLivros" em "umLivro" Executa o bloco de cdigo Coloca o prximo Livro em "umLivro" Executa o bloco de cdigo Repete at o final da Lista

O lao do tipo "foreach" o mais indicado para processar Listas. Observem tambm, que o "if" da linha 66 possui duas condies interligadas. Neste caso, foi usado o operador &&, que o "E lgico", ou seja, para que a condio como um todo seja satisfeita, cada uma de suas partes deve ser satisfeita. muito importante notar que usamos o mtodo ".equals()" para comparar o String nome da Pessoa. Esta a forma correta de se comparar Objetos em Java. O operador "==", s deve ser usado para comparar tipos primitivos (int, boolean, char, double, etc.). Depois disso tudo, hora de executarmos os testes novamente. Vamos mais uma vez, selecionar a Classe de Teste BibliotecaTest e usar o atalho j conhecido: Alt + Shift + X + T:

136

Podemos ver que apesar de o teste do mtodo "movimentaLivro" ter falhado, o teste do mtodo "getLivrosPorPessoa", passou! Isso est correto, pois ns ainda no terminamos o mtodo "movimentaLivro". Neste ponto, algum pode perguntar: mesmo necessria a primeira condio do if, verificando se o objeto Pessoa associado ao Livro no est nulo? Vamos alterar o cdigo desta forma:

E testar novamente, selecionando a Classe de Teste BibliotecaTest e usando o atalho: Alt + Shift + X + T:

Desta forma ocorreu um erro de compilao, gerando a mensagem "NullPointer Exception". Esta uma das mensagens de erro mais comuns no ambiente Java. E o motivo sempre o mesmo: A tentativa de manipular um Objeto inexistente (null). No nosso caso, com a retirada do teste, os Livros que no tinham sido atribudos a nenhuma Pessoa, passaram a ser considerados, e no primeiro Livro da nossa Lista que no tinha Pessoa atribuda, onde tentamos obter o nome da Pessoa com "umLivro.getPessoa().getNome()" ocorreu o erro. Tendo aprendido mais um pouco sobre os possveis erros e necessidade de testes, vamos voltar o cdigo situao anterior com as duas condies:

137

Feito isso, podemos voltar ao mtodo de Emprstimo, e implementar a verificao do limite de Livros por Pessoa, assim:

Foram duas as modificaes feitas. Vamos ver linha a linha: 46. Foi criada a varivel "livrosEmprestados", que armazena o tamanho da Lista de Livros da Pessoa que foi passada como parmetro. 48. Foi inserida uma segunda condio no "if" para verificar se a quantidade de Livros que a Pessoa passada como parmetro pediu emprestado, ainda menor que o limite. Com estas alteraes feitas, hora de testar novamente, selecionando a Classe de Teste BibliotecaTest e usando o atalho: Alt + Shift + X + T:

Agora sim, o teste deve passar. Uma ltima verificao deve ser feita. Como j havamos includo a Classe "BibliotecaTest" na nossa Suite de testes "AllTests", basta selecion-la, e usando o mesmo atalho: Alt + Shift + X + T, executar todos os testes, garantindo que estas ltimas alteraes no causaram problema em outras partes da aplicao.

138

E a est. Todos os testes devem ter passado e a nossa aplicao j evoluiu bastante!

Tudo certo? Ento podemos prosseguir...

139

Aula: 15 - Finalizando a Classe Biblioteca


Criando os mtodos finais da Classe Biblioteca

J estamos quase no fim da nossa tarefa. Os mtodos bsicos j foram criados. Agora, precisamos criar os mtodos finais:

getLivrosDisponiveis getLivrosIndisponiveis toString para a Classe Livro toString para a Classe Biblioteca

Nota: desta aula em diante ser usado o Windows7


O mtodo getLivrosDisponiveis

Este mtodo vai retornar uma lista dos livros que ainda no foram emprestados. Mais uma vez, comeando pelos testes...

Usando os facilitadores do Eclipse, vamos codificar o mtodo de teste assim:

Prosseguindo, podemos copiar e alterar linhas de mtodos anteriores at chegar a este ponto:

Neste caso, vamos logo criar o mtodo.

140

Salvando o mtodo criado.

Ficaremos livres de erros no nosso cdigo de teste.

Depois de copiar e alterar mais alguma linhas de cdigo, o mtodo de teste deve estar assim:

O prximo passo codificar o mtodo getLivrosDisponiveis propriamente dito. Para isso, vamos aproveitar o cdigo do mtodo getLivrosPorPessoa, e depois de copiar e alterar as suas linhas, devemos ter o mtodo assim:

141

Em seguida vamos executar a Suite de testes:

Se tudo correu bem na codificao, os testes devem passar:

142

O mtodo getLivrosIndisponiveis

De forma anloga ao mtodo anterior, vamos criar o mtodo de teste para este mtodo, tendo como base o mtodo testGetLivrosPorPessoa. Depois de copiar e alterar algumas linhas, devemos ter o mtodo de teste assim:

Criando o mtodo...

O mtodo vazio gerado:

Com o mtodo vazio salvo, e de volta a nossa Classe de Teste, devemos estar livres dos erros. Este mtodo de teste deve ser bem familiar a esta altura.

143

Sendo: 1. 2. 3. 4. Inicializao dos objetos de teste Nenhum Livro indisponvel Um Livro indisponvel Dois Livros indisponveis

Mais uma vez, o prximo passo codificar o mtodo getLivrosIndisponiveis propriamente dito. Para isso, vamos aproveitar o cdigo do mtodo getLivrosDisponiveis, e depois de copiar e alterar as suas linhas, devemos ter o mtodo assim:

Com o trabalho feito at aqui salvo e com a classe BibliotecaTest selecionada, vamos usar o atalho: Alt+Shift+X, T para executar os testes desta classe. Novamente, se tudo correu bem na codificao, os testes devem passar:

144

Os mtodos toString para as nossas Classes

Como j explicado anteriormente, o mtodo toString herdado da Classe Object. Este mtodo deve ser sobre escrito na maior parte das Classes. Ele retorna uma representao em String do Objeto.
O mtodo toString para a Classe Livro

Mais uma vez, comeando pelos testes, vamos abrir a nossa Classe de testes para Livros.

Aproveitando algumas linhas do mtodo testGetPessoa, e efetuando as alteraes necessrias, vamos ter o seguinte resultado:

145

Vamos agora, codificar o mtodo toString na Classe Livro.

O resultado final deve ser este:

A esta altura, o contedo deste mtodo tambm deve ser familiar a todos, mas vamos descrever as suas principais linhas: 35. Define a varivel local que vai armazenar a situao do Livro. 36. O "if" que define a situao do Livro. o Se o Livro no possui Pessoa associada, a situao "Disponvel". o Se o Livro possui Pessoa associada, a situao "Emprestado para" esta Pessoa. 42. Retorna a combinao: Ttulo + Autor + Situao como um String. Com o trabalho feito at aqui salvo e com a classe LivroTest selecionada, vamos usar o atalho: Alt+Shift+X, T para executar os testes desta classe. Novamente, se tudo correu bem na codificao, os testes devem passar:

146

O mtodo toString para a Classe Biblioteca

Diferente da anterior, a Classe Biblioteca, pode conter uma grande quantidade de Livros e Pessoas. O mtodo toString neste caso, vai retornar um sumrio de informaes. Vamos abrir a nossa Classe de testes para Biblioteca. Criando o mtodo...

Aproveitando algumas linhas j conhecidas, e efetuando as alteraes necessrias, vamos ter o seguinte resultado:

147

Vamos agora, codificar o mtodo toString na Classe Biblioteca.

O resultado final deve ser este:

Mais uma vez, com o trabalho feito at aqui salvo e com a classe BibliotecaTest selecionada, vamos usar o atalho: Alt+Shift+X, T para executar os testes desta classe. Novamente, se tudo correu bem na codificao, os testes devem passar:

Para finalizar esta aula, podemos executar toda a Suite de testes para garantir que todas as Classes continuam funcionando adequadamente.

148

E a est. Todos os testes devem ter passado e a nossa aplicao est praticamente pronta!

Tudo certo? Ento podemos prosseguir...

149

Aula: 16 - Criando o mtodo main e o arquivo JAR


O progresso at agora

Neste ponto, a nossa aplicao est praticamente completa. Vejamos:


Temos as Classes Pessoa, Livro e Biblioteca codificadas. Como usamos a metodologia TDD, temos um alto grau de confiana de que as nossas Classes vo funcionar de acordo com o que foi projetado.

No entanto, ns s executamos partes da aplicao, e ainda assim, partindo das Classes de Teste: PessoaTest, LivroTest e BibliotecaTest usando o JUnit.
Executando um programa Java

Nesta ltima aula ns vamos criar um programa independente para criar e modificar Objetos do tipo Biblioteca. Para tal, precisamos entender que: 1. Quem executa um programa Java, o Java Runtime Engine (JRE). 2. Depois de carregar as nossas Classes em memria, o JRE, precisa saber o que fazer depois. 3. Para isso, O JRE tenta executar um mtodo especial chamado "main" 4. Portanto, precisamos criar o mtodo "main" em uma de nossas Classes. Um exemplo: Se a nossa aplicao tivesse algum tipo de Interface Grfica com o Usurio (ou GUI), bastaria apresentar um formulrio no mtodo "main" e deixar o usurio prosseguir da. Criar uma Interface Grfica em Java, est alm do escopo deste curso, portanto: No nosso caso: Vamos simular uma ao do usurio sobre as nossas Classes no mtodo "main" e exibir os resultados na console do sistema. Para finalizar, assim que tivermos tudo isso funcionado dentro do Eclipse, vamos usar o seu "Ajudante de Exportao" para criar uma arquivo executvel do tipo JAR. Arquivos do tipo JAR, podem ser executados em qualquer computador (ou dispositivo) que execute Java (que tenha o JRE ou JDK instalados).

150

Na prtica

Podemos colocar o mtodo "main", em qualquer das nossas Classes, mas vamos fazer isso, na Classe Biblioteca, considerando que ela a principal Classe da nossa Aplicao.

Mais uma vez, usando o assistente de cdigo do Eclipse, vamos deixar que ele crie o mtodo para ns. Vamos digitar a palavra "main", seguida por Ctrl+Espao e aceitar o mtodo "main" proposto:

151

Obtendo o seguinte:

O mtodo "main", um mtodo esttico (static), que no retorna nada (void), e recebe como parmetro um Array de Strings chamado "args" (String[] args). Isso permite a um programa Java ler parmetros da linha de comando. No vai ser o caso do nosso exemplo. Vamos prosseguir usando o assistente de cdigo e fazer o seguinte:

Criar uma Biblioteca. Criar Livros e Pessoas. Associar Livros e Pessoas Biblioteca. Efetuar alguns emprstimos e devolues. Tudo isso, exibindo os resultados parciais na console.

Comeamos assim: "new" + Ctrl+Espao, e selecionando "create new object".

152

Completando para nos atender:

Vamos prosseguir usando o assistente de cdigo at obter o seguinte:

O prximo passo, exibir o status atual da Biblioteca. Vamos criar o mtodo "imprimeStatus" para esta finalidade. Mtodo esse que ser utilizado sempre que for necessrio exibir o status atual da Biblioteca medida que o nosso programa vai sendo executado.

153

Assim: "sysout" + Ctrl+Espao.

Obtendo:

Completando esta primeira parte:

154

Usando a mesma estratgia, vamos criar novas situaes:

Usando o assistente de cdigo, vamos criar o mtodo "imprimeStatus".

Obtendo:

155

Depois de devidamente alterado para exibir a situao de cada Livro, de cada Pessoa e da Biblioteca como um todo, o mtodo deve ficar assim:

Agora que a nossa Classe possui um mtodo "main", ela pode ser considerada uma aplicao Java, e como tal pode ser executada. Para isso, temos algumas opes: usando o menu principal, usando teclas de atalho ou usando o menu de contexto. Com a Classe Biblioteca selecionada, usar o boto direito do mouse para acionar o menu de contexto e selecionar: Run As Java Application

156

O que deve produzir um resultado semelhante a este na console:

Agora que temos a nossa aplicao funcionando no Eclipse, podemos nos preocupar em gerar um arquivo "executvel" para ela. No ambiente Java, este arquivo "executvel" do tipo JAR (ou Java Archive). Este arquivo vai poder ser executado fora do Eclipse em qualquer sistema que seja compatvel com Java. Para isso, vamos usar o menu: File Export...

157

E na janela que se abre: Java JAR file

Na janela seguinte, fica claro o motivo de ter criado os nossos testes em um pacote separado. Neste momento, podemos exportar apenas o cdigo fonte que o que efetivamente necessrio.

158

Na tela seguinte vamos aceitar os valores default:

Na prxima tela vamos especificar a Classe que contm o mtodo "main":

159

Acionando o boto "Browse":

A qual selecionada:

160

Feito isso, o arquivo JAR deve ter sido gerado:

Para testar este nosso executvel fora do Eclipse, ser necessrio abrir uma console do sistema operacional no diretrio onde o arquivo JAR foi gerado. No Windows XP, a maneira clssica era usar o comando "Run" ou "Executar", digitar o comando "cmd", para chamar a console do sistema, e a partir da, chegar ao diretrio desejado e executar os comandos necessrios.

J no Windows 7, o comando "Run" no fica habilitado por default, e a opo da barra de pesquisa, por vezes, muito lenta. Se voc j est usando o Windows 7 como eu, vai aqui uma dica de como habilitar esta opo no menu "Start" ou "Iniciar": Acione o boto direito do mouse no menu "Start" ou "Iniciar" e selecione a opo: Properties ou Propriedades

161

Na tela que se abre, acione o boto "Customize" ou "Customizar":

162

Use a barra de rolagem at localizar o comando Run e selecione-o:

Clique OK, Apply e OK novamente nas telas anteriores. Isso deve fazer surgir a opo de "Run" no menu Start.

De volta ao nosso objetivo, vamos usar esta opo Run do menu Start. Na tela que se abre, vamos digitar "cmd".

163

O que deve fazer abrir uma console do sistema:

Agora, com os comandos normais do DOS, devemos nos posicionar no diretrio onde o arquivo JAR foi gerado:

E l emitir o comando para executar a nossa aplicao:


java -jar Biblioteca.jar

E o resultado esperado deve ser obtido:

164

Lembrando que o comando "java" pode ser executado de qualquer lugar, pois a sua localizao est contida na varivel de ambiente do sistema chamada PATH. FIM - Este o final do curso.

Congratulaes! Voc no mais um Iniciante em Java. Grato por ter decidido usar este material para a sua iniciao.
Uma palavra final.

Alguns de vocs podem estar se perguntando: Mas onde est o cdigo fonte? Sim, comum neste tipo de curso, um link para que os alunos faam o Download do cdigo completo. Sinto desapontar alguns, mas no vai ser esse o nosso caso. A principal idia aqui fazer com que voc pratique, e digitar o cdigo, no nosso caso, faz parte do aprendizado. O Eclipse possui inmeros recursos de auxlio, dos quais vimos apenas uma pequena parte. Quando voc digita o seu prprio cdigo, coisas inesperadas podem ocorrer, erros de digitao podem ser cometidos... Tudo isso bom! Vai permitir a voc aprender mais. Usem a lista de discusso para trocar idias e dar feedback!

Java para Iniciantes Visite este grupo

Grande Abrao.

165