Vous êtes sur la page 1sur 181

0

Java Para

Curso de Java bsico


para Iniciantes
Usando Eclipse
1.
2.
3.
4.

Por: Marcos Ricardo

5.
6.
7.
8.
9.
10.
11.
12.

Java para Iniciantes

Visite este grupo

13.
14.
15.
16.
17.
18.
19.

O que o curso?
O que Java e como funciona?
Instalando e Aprontando o Java
Instalando e Aprontando o
Eclipse
Classe Pessoa (atributos e
construtor)
Classe Pessoa (mtodos get e set)
Usando o Scrapbook do Eclipse
JUnit no Eclipse - parte 1
JUnit no Eclipse - parte 2
"Test-First Development" no
Eclipse
Classe Livro
Adicionando Pessoa Classe
Livro
Listas e ArrayList
Iniciando a Classe Biblioteca
Criando os primeiros mtodos na
Classe Biblioteca
Criando os mtodos de
Emprstimo e Devoluo
Evoluindo os mtodos de
Emprstimo e Devoluo
Finalizando a Classe Biblioteca
Criando o mtodo main e o
arquivo JAR

2011-2014 - PGINA ATUALIZADA EM: 17 DE MAIO DE 2013


OFERECIDO POR:

HOSPEDADO POR:

O que o curso?

Anterior | ndice | Prximo

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).

Inscreva-se no grupo Java para iniciantes


Email:

Visite esse grupo

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
Anterior | ndice | Prximo

Viso geral de Java

Anterior | ndice | Prximo

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.

Anterior | ndice | Prximo

Instalando e Aprontando o Java

Anterior | ndice | Prximo

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...


Anterior | ndice | Prximo

Detalhes da instalao do JDK com


GlassFish

Anterior | ndice | Prximo


Passo a passo:

Agora voc tem no s o JDK instalado, como tambm o GlassFish, um servidor de aplicaes compatvel com Java EE
6.
Anterior | ndice | Prximo

Instalando e Aprontando o Eclipse

Anterior | ndice | Prximo

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.
recomendado nesse momento que voc observe na seo de Atualizaes, um artigo sobre o que mudou no Eclipse verso
"Juno", que em Maio de 2013, a verso mais atual.

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:
Release

Data

Verso

Projetos

Juno

27 de Junho 2012 4.2

Juno projects

Indigo

22 de Junho 2011 3.7

Indigo projects

Helios

23 de Junho 2010 3.6

Helios projects

Galileo

24 de Junho 2009 3.5

Galileo projects

Ganymede 25 de Junho 2008 3.4

Ganymede projects

Europa

Europa projects

29 de Junho 2007 3.3

Callisto

30 de Junho 2006 3.2

Callisto projects

Eclipse 3.1 28 de Junho 2005 3.1


Eclipse 3.0 21 de Junho 2004 3.0

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.

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
-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.

Tudo certo? Ento podemos prosseguir...


Anterior | ndice | Prximo

Aula 01 - Objetos e Classes Java

Anterior | ndice | Prximo

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".
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

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;
}
}

Bicicleta.java hosted with by GitHub

view raw

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 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:
1
2
3
4
5
6
7
8
9
10
11
12
13

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);
}
}

Controle.java hosted with by GitHub

view raw

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.

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

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

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:

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"

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.

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.
Tipos de dados primitivos do Java:
Tipo

Descrio

boolean Pode assumir o valor true ou o valor false


char

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.

short

Inteiro de 16 bits em notao de complemento de dois. Os valores possveis cobrem a faixa de -2-15=-32.768 a 215-1=32.767

int

Inteiro de 32 bits em notao de complemento de dois. Pode assumir valores entre -231=2.147.483.648 e 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.

float

Representa nmeros em notao de ponto flutuante normalizada em preciso simples de 32 bits em conformidade com a norma IEEE
754-1985. O menor valor positivo representvel por esse tipo 1.40239846e-46 e o maior 3.40282347e+38

double

Representa nmeros em notao de ponto flutuante normalizada em preciso dupla de 64 bits em conformidade com a norma IEEE
754-1985. O menor valor positivo representvel 4.94065645841246544e-324 e o maior 1.7976931348623157e+308

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.
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:

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:
1
2
3
4
5

public class Pessoa {


private String primeiroNome;
private String ultimoNome;
private String endereco;

6
7
8
9
10
11
12
13

private String nomeDeUsuario;


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

Construtor.java hosted with by GitHub

view raw

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".

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...


Anterior | ndice | Prximo

Aula 02 - Classes e Mtodos Java

Anterior | ndice | Prximo

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.

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:

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 (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.

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;
}

1
2
3
4
5

Metodo.java hosted with by GitHub

view raw

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.
2.
3.
4.

Modificadores tais como: public, private, e outros que voc ver no futuro.
O tipo de dado retornado pelo mtodo, ou void se o mtodo no retornar um valor.
O nome do mtodo seguindo as regras de nomes de campos, mas com uma conveno um pouco diferente.
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.
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:

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:

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:

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.

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

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;
}
public void setNome(String outroNome) {
nome = outroNome;
}
public int getMaxLivros() {
return maxLivros;
}
public void setMaxLivros(int outroValor) {
maxLivros = outroValor;
}
}

pessoa01.java hosted with by GitHub

view raw

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

Tudo certo? Ento podemos prosseguir...


Anterior | ndice | Prximo

Aula 03 - Usando o Scrapbook do Eclipse

Anterior | ndice | Prximo

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.

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:

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:

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:

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.

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.

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:

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:

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:

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...


Anterior | ndice | Prximo

Aula 04 - JUnit no Eclipse - parte 1

Anterior | ndice | Prximo

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.

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

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:

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:

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:

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:

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:

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.
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:

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"

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:

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...


Anterior | ndice | Prximo

Teste de software

Anterior | ndice | Prximo

O que ?
A qualidade de um Software est intimamente ligada a qualidade dos testes empregados durante e aps o seu
desenvolvimento.

Teste de Software, qualquer atividade destinada a avaliar caractersticas e capacidades de um programa ou sistema, e
determinar se ele cumpre os seus requisitos. Apesar de admitido como crucial para a qualidade do software e apregoado
por desenvolvedores, o seu entendimento e aplicao permanece limitado devido a algumas dificuldades inerentes ao
processo de desenvolvimento de software.

A grande dificuldade em termos de testes comea com a complexidade da funcionalidade sendo desenvolvida. Um
correto entendimento do objetivo da funcionalidade, seus requisitos funcionais e no funcionais, as expectativas do
usurio em termos de usabilidade, produtividade e performance, so itens que vo influenciar diretamente a qualidade
do produto que ser desenvolvido e entregue.

Testar, muito mais do que simplesmente "debugar" partes da aplicao e verificar se cada mtodo que a compe est
fazendo o que dele se espera. necessrio e fundamental, perceber se a "orquestrao" destes mtodos foi feita de forma
coerente e atendendo s especificaes de necessidades e padres estabelecidos.

O desenvolvedor no uma mquina!


A dificuldade na entrega de software de qualidade, na maior parte das vezes est ligada ao perfil das pessoas envolvidas
no processo de desenvolvimento, e no necessariamente ao processo de desenvolvimento de software empregado.
fundamental que as pessoas diretamente envolvidas no processo de desenvolvimento de software estejam
visceralmente comprometidas com a qualidade do trabalho que entregam, acima de qualquer outro fator.

Tem uma frase do Robert C. Martin (o popular Uncle Bob) sobre isso que ficou muito conhecida:
"Desenvolvedor que no testa como um cirurgio que no lava as mos"
Existem fatores que influenciam a qualidade do software aos quais todo desenvolvedor deve estar atento:
Funcionamento (externo) Arquitetura (interno) Adaptabilidade (futuro)
Correo

Eficincia

Flexibilidade

Disponibilidade

Testabilidade

Reusabilidade

Usabilidade

Documentao

Manutenibilidade

Integridade

Estrutura

Fica bem claro, que os desenvolvedores em geral, se preocupam com os fatores internos durante o desenvolvimento.
Alguns at levam em conta os fatores futuros, mas poucos so aqueles que levam em conta os fatores externos. E por
incrvel que possa parecer aos desenvolvedores, so os fatores externos que causam o maior impacto, tanto para o lado
positivo quanto para o negativo. De que adianta por exemplo, entregar uma funcionalidade sem erros internos se:
Os padres de CSS e imagens definidos pelo cliente no esto sendo atendidos.
Os campos no possuem mscaras adequadas ao seu preenchimento.
O tamanho mximo dos dados dos campos no foram considerados, causando truncamento.
etc. etc. etc.
Alguns podem considerar estes problemas coisas menores, pequenas bobagens. Mas o fato que softwares entregues
com este tipo de problema, no podem sequer ser apresentados ao cliente!
claro que podemos definir alguns artefatos mnimos para a entrega de uma funcionalidade. No entanto, isso por si s,
no garante a qualidade do produto entregue.

Teste antes ou teste depois?


Muito se tem discutido sobre a eficcia da metodologia TDD, que prope que o desenvolvedor inicie o desenvolvimento
de uma funcionalidade pelos seus testes que devem cobrir todos os requisitos. De incio, estes testes, claro, vo falhar.
E a medida que a funcionalidade for sendo desenvolvida e os requisitos atendidos, os testes vo comear a passar.

Uma outra corrente, mais formal, prope que se codifique os testes aps o desenvolvimento da funcionalidade.
Existe um estudo de 2005, conduzido pelo NRC Institute for Information Technology sobre a eficcia do TDD,

comparando-o com a abordagem convencional, que concluiu basicamente o seguinte:


Desenvolvedores usando TDD escrevem mais testes por unidade de esforo de programao;
Um maior nmero de testes escritos leva a um aumento proporcional da produtividade;
O uso de TDD, encoraja a decomposio, melhora o entendimento e reduz o escopo das tarefas;
Em consequncia do menor escopo, testar durante o desenvolvimento reduz a necessidade de debug e o
retrabalho;
Desenvolvedores usando TDD no alcanaram melhor qualidade em mdia;
Desenvolvedores usando TDD conseguiram maior consistncia na qualidade;
Escrever mais testes aumenta o nvel mnimo de qualidade atingido, independente da metodologia;
De fato, a metodologia de desenvolvimento em relao aos testes empregada, no o fator mais importante. O
importante testar sempre, e o mximo possvel. O emprego de TDD, aparentemente encoraja os desenvolvedores a
"certificar" o seu cdigo usando assertivas de testes.

Checklist para Desenvolvedores


Sem ter a pretenso de estabelecer algum tipo de padro, segue aqui um checklist que pode ser til aos desenvolvedores
em incio de carreira, e at para aqueles mais experientes que no tenham exercitado a prtica de testes de forma
conveniente.

Entendendo os requisitos
Sendo uma aplicao nova, estudar a documentao de requisitos detalhadamente. Havendo dvidas, buscar
esclarecimento diretamente com o usurio gestor ou patrocinador do projeto. Havendo necessidade solicitar a mediao
ou apoio de um analista de negcios.
Sendo uma aplicao j existente em fase de migrao ou aprimoramento, navegar pela verso atual da aplicao.
Navegar pelo projeto atual, entendendo todas as funcionalidades implementadas. Havendo dvidas, solicitar apoio de
quem conhea a verso atual da aplicao tanto no seu comportamento externo quanto no seu funcionamento interno.
Definindo o pacote da Funcionalidade
De acordo com o padro de projetos adotado, procurar separar a funcionalidade sendo implementada de maneira clara
dentro do projeto. Isso efetuado geralmente criando um pacote Java para cada funcionalidade.
Procure sempre criar um pacote especfico para mtodos e componentes de uso geral do projeto. A medida que as
funcionalidades forem desenvolvidas e implementaes relativas a uma funcionalidade se mostrarem teis a outra ou
outras, estas implementaes devem ser movidas para este pacote de uso geral e passar e ser usada de l por todas as
funcionalidades.
Iniciando a Implementao
De acordo com a maioria das frameworks Java adotadas, usando o modelo MVC, uma funcionalidade subdividida em
pacotes de implementao, separando bem as partes, assim:
Pacote

Objetivo

DAO

Acesso a dados

Facade

Lgica de Negcio

Presentation Interface externa

Eu costumo usar a ordem inversa durante o desenvolvimento, da seguinte forma:


1. Presentation: um esboo das pginas, se possvel que possibilite a navegao se houver mais de uma tela
envolvida. Aqui, o primeiro ponto de ateno! Deve haver uma preocupao especial por parte do
desenvolvedor em que a interface esteja aderente aos padres definidos (CSS, imagens, etc.) e que as
caractersticas de cada um dos campos como: tamanho mximo, mascaras, etc. estejam de acordo com o
esperado. Tudo isso, considerando o que est definido na documentao no caso de uma aplicao nova, ou

simplesmente comparando com a verso atual no caso de uma migrao.


2. Facade: um esboo da lgica de negcio. Aqui, o desenvolvedor j deve ter uma ideia bem fundamentada
dos principais mtodos que devero ser orquestrados de maneira a atender os requisitos da funcionalidade.
Um outro cuidado que eu sugiro aqui, evitar mtodos definidos como "void". Mtodos orquestradores,
devem no mnimo, retornar um booleano indicando se a operao comandada por ele foi bem sucedida ou
no.
3. DAO: antes de implementar qualquer mtodo de acesso a dados, o desenvolvedor deve estar perfeitamente
familiarizado com as tabelas e campos envolvidos na funcionalidade deve ter feito experincias com os
comandos SQL que pretende usar na implementao. Caso no tenha experincia no uso do banco de dados
adotado, deve buscar ajuda de algum com mais experincia, pois qualquer deciso errada neste ponto pode
comprometer a performance da funcionalidade e por consequncia da aplicao. Aqui, mais uma vez, procure
evitar mtodos definidos como "void". Da mesma forma, no faz sentido um mtodo de acesso a dados no
retornar no mnimo um booleano indicando se a ao pretendida no banco de dados foi bem sucedida ou
no.
Depois de alguma pesquisa, conclu o seguinte sobre mtodos definidos como "void":
Escrever testes para "mtodos void" leva inevitavelmente a algum tipo de POG, e acaba no garantindo a qualidade do
mtodo em si. Talvez apenas sobre algum dos possveis efeitos colaterais do mtodo sendo testado.
Portanto, eu evito o uso de "mtodos void" ao mximo!
Sobre TDD, BDD e a aplicao dessas metodologias: O desenvolvedor no precisa necessariamente aplicar esta ou
aquela metodologia usando esta ou aquela ferramenta. Mas eu sugiro fortemente que os desenvolvedores procurem: a
medida que vo entendo as especificaes de uma aplicao nova ou entendendo o funcionamento de uma aplicao j
existente, procurem pensar em como a nova aplicao ou nova verso vai ser testada quando estiver sendo criada ou
estiver pronta. Que tipo de teste vai garantir que a nova aplicao atende os requisitos.
Voc no precisa necessariamente codificar testes usando BDD mas deve pensar no projeto como um todo, usando os
conceitos de BDD!

Requisitos mnimos
Existem claro aqueles requisitos mnimos que so exigidos de um desenvolvedor.

Um conjunto bastante popular hoje em dia o que fora o uso de Java doc e exige o uso de boas prticas de codificao:
Checkstyle e PMD.
Sendo esta uma prtica cada vez mais frequente, e estando o Eclipse adequadamente configurado, eu costumo adotar a
seguinte prtica: Depois de ter definido a interface (assinatura) de um mtodo, crio a interface para ele, e logo em
seguida o Java Doc correspondente. Ao criar a implementao do mtodo, basta usar a anotao "@inheritDoc". No
esquecendo de documentar os mtodos privados assim que sejam criados. Estas medidas simples evitam muita perda de
tempo quando se passa o projeto pelas ferramentas de validao.
Em relao a testes, o que considero o mnimo necessrio, so testes de JUnit para cada mtodo de acesso a dados que
for criado. Alm disso, em algumas situaes vale a pena criar testes de JUnit para os mtodos de negcio do pacote
facade.

E agora, os testes mais importantes


Os testes mais importantes para qualquer desenvolvedor, so, claro, os testes feitos por ele, desde que estes sejam bem
criteriosos.

Com a funcionalidade implementada, cabe ao desenvolvedor garantir que tudo que dela se espera, efetivamente esteja
sendo feito. No somente em termos de banco de dados, mas tambm em termos de interface. Neste momento, o
desenvolvedor deve fazer o papel de um usurio exigente, no permitindo que nenhum pequeno detalhe passe
desapercebido.

So os Testes do desenvolvedor

Uma palavra final


Como j mencionado anteriormente, no importa muito se o teste feito antes ou depois de codificar a soluo. O
fundamental que o desenvolvedor esteja imbudo do espirito de qualidade na entrega do que ele produz.
A alguns anos, eu acabei conhecendo o Bryan Liles, um cara viciado em qualidade e testes. Ele criou a sigla TATFT.
Tem uma apresentao do Bryan sobre testes muito legal aqui (12 minutos). E ele continua firme nas suas convices.

J a alguns anos o TDD deixou de ser o foco das atenes e passamos a conviver com o BDD (Behavior Driven
Development).
O Evan Light, deu uma outra interpretao a sigla TATFT, que eu tambm gosto muito.
Resumindo:
No incio, era o "pseudo cdigo"
Depois, vieram os "testes unitrios"
Depois, veio o "escrevendo testes antes"
Que evoluiu para o "Test Driven Development"
Depois, veio o movimento "think different"
Depois, veio o "Behavior Driven Development"
Por consequncia: "it.should become(:a_self_improving_feedback_loop)"
O que nos leva a: "you should THINK all the fucking time"

THINK all the fucking time

Tudo certo? Ento mos a obra! E aos TESTES!


Anterior | ndice | Prximo

Aula 05 - JUnit no Eclipse - parte 2

Anterior | ndice | Prximo

JUnit Bsico
Neste tpico vamos comear com um exemplo simples para ilustrar os conceitos bsicos envolvidos nos testes com
JUnit.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

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);
}
}

SimpleTest.java hosted with by GitHub

view raw

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.

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.

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:

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.
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:

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...

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...


Anterior | ndice | Prximo

Aula 06 - "Test-First Development" no


Eclipse

Anterior | ndice | Prximo

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:

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:

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:

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:

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...

Aula 07 - Criando a Classe Livro

Anterior | ndice | Prximo

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.

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:

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:

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.
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.

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:

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:

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 acion-la, assim:

O que nos apresenta o seguinte:

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:

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:

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...


Anterior | ndice | Prximo

Aula 08 - Adicionar Pessoa Classe Livro

Anterior | ndice | Prximo

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:

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:

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.

Modificadores de Acesso
Em Java existem 4 modificadores de acesso:
1.
2.
3.
4.

public - o objeto acessado de qualquer Classe ou Subclasse


private - o objeto acessado apenas na Classe em que foi criado
sem modificador - o objeto acessado apenas por Classes dentro do "pacote" em que foi criado
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:

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:

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.

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:

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...


Anterior | ndice | Prximo

Aula 09 - Listas e ArrayList

Anterior | ndice | Prximo

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:

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.
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".

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

Comeamos criando uma lista vazia, assim:

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:

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:

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:

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:

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".

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...


Anterior | ndice | Prximo

Aula 10 - Classe Biblioteca

Anterior | ndice | Prximo

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:

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:

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:

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".

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".

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.

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.

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.

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.

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.

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...


Anterior | ndice | Prximo

Aula 11 - Primeiros Mtodos da Classe


Biblioteca

Anterior | ndice | Prximo

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:

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:

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.
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.

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.

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.

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:

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:

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 (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:

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:

Mais alguns vo ser implementados em breve.

Tudo certo? Ento podemos prosseguir...


Anterior | ndice | Prximo

Aula: 12 - Os mtodos de Emprstimo e


Devoluo

Anterior | ndice | Prximo

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
Empresta um Livro
Empresta um segundo Livro
Devolve um Livro
Devolve um segundo Livro
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?
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.
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:

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.
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:

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.
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:

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

Tudo certo? Ento podemos prosseguir...


Anterior | ndice | Prximo

Aulas: 13 e 14 - Evoluido os mtodos de


Emprstimo e Devoluo

Anterior | ndice | Prximo

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):

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.

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:

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.

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 Livro deve estar emprestado a uma Pessoa.
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:

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:

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.

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

Tudo certo? Ento podemos prosseguir...


Anterior | ndice | Prximo

Aula: 15 - Finalizando a Classe Biblioteca

Anterior | ndice | Prximo

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.

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:

Em seguida vamos executar a Suite de testes:

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

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.

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:

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:

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.
Se o Livro no possui Pessoa associada, a situao "Disponvel".
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:

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:

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.

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

Tudo certo? Ento podemos prosseguir...


Anterior | ndice | Prximo

Aula: 16 - Criando o mtodo main e o


arquivo JAR

Anterior | ndice | Prximo

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.
2.
3.
4.

Quem executa um programa Java, o Java Runtime Engine (JRE).


Depois de carregar as nossas Classes em memria, o JRE, precisa saber o que fazer depois.
Para isso, O JRE tenta executar um mtodo especial chamado "main"
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).

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:

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".

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.
Assim: "sysout" + Ctrl+Espao.

Obtendo:

Completando esta primeira parte:

Usando a mesma estratgia, vamos criar novas situaes:

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

Obtendo:

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

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...

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.

Na tela seguinte vamos aceitar os valores default:

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

Acionando o boto "Browse":

A qual selecionada:

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

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

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".

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:

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!
Agora voc j conhece os princpios bsicos de Java e j sabe como funciona a

IDE Eclipse.
Voc pode agora, seguir no processo de aprendizagem como 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!
Google Groups
Java para Iniciantes

Visite este grupo

Grande Abrao.
Anterior | ndice | Prximo

Vous aimerez peut-être aussi