Convivendo e melhorando seu relacionamento com código legado utilizando PowerMock

Tamanho: px
Começar a partir da página:

Download "Convivendo e melhorando seu relacionamento com código legado utilizando PowerMock"

Transcrição

1 Marcio Garcia Mangar bacharel em Ciência da Computação. Trabalha com Java desde Já trabalhou em empresas de pequeno e grande porte bem como startups no Brasil e Austrália desenvolvendo, migrando e integrando sistemas em Java e Ruby on Rails. Possui certificações SCJP, SCWCD, SCBCD, SCEA I e CSM. Atualmente é consultor independente, e mantém seus dois blogs: mangar.com.br e Convivendo e melhorando seu relacionamento com código legado utilizando PowerMock Neste artigo, vamos mostrar algumas técnicas para um convívio pacífico entre as gerações de código e ainda mostrar uma ferramenta utilizada para testar código até então intestável, a fim de proteger as funcionalidades já implementadas e readequar o código legado em um mais moderno e bem desenhado. á 15 anos surgia uma das mais populares e revolucionárias linguagens de programação. Por todo este tempo muitas aplicações foram construídas utilizando as mais diversas técnicas e bibliotecas. TDD surgiu juntamente com XP em meados de Ou seja, primeiro nos preocupamos em desenvolver, depois em desenvolver corretamente. Nada mais natural. No entanto, 15 anos depois ainda temos que conviver e muitas vezes integrar nossas aplicações com código legado dos anos 90. Neste artigo apresentaremos soluções de como integrar código legado e ainda assim fazer bom uso de técnicas de teste, como TDD. Também mostraremos como utilizar a ferramenta PowerMock que fará praticamente todo o trabalho sujo de testar o código legadointestável e nossos exemplos. Como consumidores, garantia é algo que todos exigimos. Imagine se fosse possível comprar um automóvel novo, e no contrato ti- fabricante cairia em descrédito, você não levaria o carro para casa e ainda faria propaganda negativa a respeito do fabricante. Transporte este exemplo para o mundo de desenvolvimento de software. Um empregador em plena consciência contrataria algum fornecedor de serviços em que no contrato constasse: Software sem garantia? Garantia de um produto não está restrito em apenas um aspecto. Mas em se tratando de desenvolvimento de software um dos pilares para se alcançar um software de qualidade é um código limpo e testado. Mas para se alcançar tal cenário, com código limpo e testado alguns percalços devem ser transpostos. O primeiro é a escrita de um código testável. Se um código é escrito sem a preocupação com a implementação de testes, este será um código muito difícil de ser garantido. Códigos intestáveis são frequentemente encontrados em sistemas 48

2 legados, desenvolvidos a alguns anos atrás sem ao menos ter testes unitários implementados, que hoje como desenvolvedores nos vimos em situação de pânico quando é necessária uma manutenção em algum ponto realmente crítico do software. Neste artigo apresentaremos técnicas e ferramentas para aprimorar o código legado com segurança, implementando testes unitários neste código antes de fazermos o refactoring para uma versão legível e testável do código legado. refactoring das funcionalidades, tenhamos conhecimento do comportamento prévio bem definido e testado de tal classe ou método. Na figura 1 é mostrada a mecânica a ser seguida no refactoring de um código legado. Legibilidade de Código Código testável é algo que deveria estar na linha de frente do backlog técnico de qualquer projeto de desenvolvimento de software. E não apenas na forma de percentual de cobertura do código, mas também na forma de legibilidade de código. Um código ilegível, sem qualquer dúvida, te levará a além de uma equipe desmotivada com performance sofrível também a um código intestável. E esta combinação altamente explosiva contribuirá muito para problemas inesperados no projeto, em especial a não-geração do valor esperado para o cliente. Figura 1. Mecânica do refactoring. Pontos de atenção Algumas práticas conduzem a um código não muito expressivo e ilegível e com isso um código de difícil implementação de testes e algumas vezes até mesmo intestável: construtor. Estes são alguns exemplos de más práticas que devem ser evitadas no desenvolvimento de qualquer aplicação. Se trechos de código utilizando algumas das práticas citadas existem no seu projeto, a primeira ação é substituí-las por convenções de código mais legíveis. No entanto, algumas vezes, por motivações diversas, como compra de uma determinada biblioteca ou utilização de uma biblioteca de código cujo o código-fonte não esteja mais disponível, será necessário o convívio com tais códigos. Uma boa iniciativa é reduzir a disseminação deste código dentro do seu projeto. A criação de pontos de integração (seams, em inglês) reduz significativamente a dependência de tais códigos. Mecânica do Refactoring Lembre-se: estamos lidando com um código legado, no qual podemos encontrar implementações bizarras, como classes extremamente longas, com algo em torno de 200 linhas, com vários níveis de abstração entre os métodos. Como um bom desenvolvedor você deve deixar a classe melhor mais legível, testável etc. do que quando você a pegou. Para conseguirmos tal feito sem que nenhuma funcionalidade deixe de funcionar corretamente, é essencial que antes de fazermos o PowerMock PowerMock é um complemento aos frameworks que geram o Mockito. Com ambos a integração é bastante natural. Não há necessidade de nenhum tipo de adaptação para a integração. O framework é distribuído sobre a licença Apache License 2.0. O código-fonte está disponível no Google Code em: google.com/p/powermock/. Os principais mantenedores são Jan Kronquist e Johan Haleby que trabalham na empresa sueca Jayway. A motivação para a utilização do framework é resolver problemas relacionados à testabilidade de código legado ou de terceiros. Códigos difíceis de testar ou mesmo impossíveis passam a ter suas chances utilizando o PowerMock. utilizando EasyMock e Mockito. Neste artigo, abordaremos a utilização integrada entre PowerMock e Mockito. Funcionamento do framework O PowerMock é um framework que estende outras bibliotecas, como Mockito e EasyMock, incluindo funcionalidades mais avançadas, tais como: Para tais feitos, o framework faz uso extensivo de manipulação de bytecode através de um classloader próprio. Para a manipulação de bytecode, ele faz uso da biblioteca Javassist ( org/javassist). 49

3 Mesmo utilizando um classloader próprio, o framework é pouco intrusivo e de fácil utilização. Se você possui conhecimentos básicos de EasyMock ou Mockito, à primeira vista, terá a impressão de que está utilizando apenas um framework. Integração com JUnit Neste artigo utilizaremos JUnit para os testes de unidade juntamente com Mockito e o PowerMock para a criação dos mock objects. A integração com JUnit é muito simples, basta incluir duas anotações em seu código de é uma anotação do JUnit. Esta define qual será o Runner a ser executado pelo JUnit, por padrão, quando não informado nenhum é utilizado o próprio Runner da versão do JUnit que você está utilizando (configurada no pom.xml). Em nossa implementação de testes utilizando o PowerMock será necessário redefinir o Runner, para que seja utilizado o runner do Mockito com JUnit, definido pela classe é uma anotação que faz parte do PowerMock. Esta informa ao classloader do framework quais serão as classes que possivelmente sofrerão manipulação de bytecode. Como parâmetro, esta anotação recebe uma classe ou um array de classes. Agora que já estamos acertados quanto ao fluxo que iremos utilizar na readequação do código legado (figura 1) e no ferramental que iremos utilizar na tarefa de implementação dos testes vamos percorrer os problemas que facilmente serão encontrados em código legado. O primeiro exemplo será a implementação de testes em código utilizando Service Locator com Singleton e Inicialização Estática de Objetos Service Locator e Singleton Nos tempos em que não se falava em Injeção de Dependência, os Service Locators eram a grande onda. Utilizar este Design Pattern era sinal de que sua aplicação fazia uso da mais avançada e excepcional tecnologia em que poderia se ter contato no mundo Java: EJB 2.X. As mais avançadas implementações deste Pattern sugeririam inclusive a instanciação única e cache dos recursos adquiridos. Isso quer dizer, o Service Locator era um Singleton e um controlador de Cache, infringia duas vezes o princípio da Responsabilidade Iremos testar três pontos em um cliente que fará uso do nosso ServiceLocator: Na Listagem 1 você encontrará um trecho do nosso Cliente (SL- Client.java) e na Listagem 2 um trecho do ServiceLocator, nada que possamos nos orgulhar de ter implementado, mas ainda assim um ServiceLocator válido. Listagem 1. Cliente do ServiceLocator: SLClient.java. public class SLClient { private static String JNDI_LOCATION = not loaded ; static { JndiLocationsLoader loader = new JndiLocationsLoader(); SLClient.JNDI_LOCATION = loader.getfirstjndilocation(); public void executearemotemethod() { ServicoDeExclusao servico = (ServicoDeExclusao) ServiceLocator.getInstance(SLClient.JNDI_LOCATION).lookup( ServicoDeExclusao.class); servico.delete( some object to be excluded ); Listagem 2. ServiceLocator public class ServiceLocator { private String jndi; private static ServiceLocator instance; private ServiceLocator() { public static ServiceLocator getinstance(string jndi) { if (ServiceLocator.instance == null) { ServiceLocator.instance = new ServiceLocator(); instance.jndi = jndi; return ServiceLocator.instance; public Object lookup(class<?> classname) { System.out.println( Locate Class: + classname.getname() + jndi); return null; Inicializamos nossa classe de teste com as duas anotações já comentadas Respectivamente informando que vamos utilizar o Runner do PowerMock e a classe a ser manipulada será a ServiceLocator.class. A Listagem 3 mostra esta inicialização. Mais adiante temos as declarações e as inicializações dos mock-objects utilizando a do próprio Mockito (org.mockito.mock). Utilizando esta anotação torna-se desnecessário a inicialização dos objetos mock, por exemplo, dentro do método public void setup() { PowerMockito.mockStatic(ServiceLocator.class); setup: neste ponto começam as alterações específicas para o PowerMock. 50

4 Na primeira linha nada de novo, estamos apenas orientando um objeto do tipo ServiceLocator a quando chamado o método lookup com qualquer que seja o parâmetro, este deverá retornar outro objeto recém-mocado chamado servicodeexclusao. Adiante, utilizando o PowerMock, informamos que a classe Ser- setup, voltamos a utilizar o Mockito para definir o resultado da chamada ao método getinstance, que é um método estático da classe ServiceLocator. Um ponto interessante a ser notado é que a variável servicodeexclusao não é uma variável de instância e muito menos injetada na classe cliente. Esta é carregada no escopo do método através de uma chamada a um método estático do ServiceLocator. Para testar o método executearemotemethod seria necessário simular todo o comportamento dos métodos: getinstance e lookup da classe ServiceLocator. Certamente seria muito trabalhoso. Outra má prática duplamente e propositalmente implementada neste exemplo é a utilização de métodos void. Tendo como foco a testabilidade, uma implementação como esta é inviável de ser testada sem nenhuma readequação. Uma funcionalidade já manjada é a utilização dos métodos verify() para este propósito, já que não é possível verificar através de Asserts o retorno dos métodos ao menos conseguiremos verificar se a chamada ao serviço em nosso caso o método delete() foi feita. Listagem 4. Saída produzida pela execução da classe de teste: SLClient_Test Execução da Inicialização Estática de SLClient. Constructor de Base Client Chamada a um WS informando que algum cliente está ativo.. mj.teste. servicelocator.client.slclient Construtor de StClient Chamada a um WS informando que o cliente Cliente está ativo.. mj.teste. servicelocator.client.slclient execução de executedeletemethod Construtores A classe SLClient é subclasse de BaseClient, que por sua vez ao ser instanciada efetua uma chamada fictícia a um WebService solicitando o registro da mesma. Mais detalhes podem ser vistos no código-fonte completo. Este é apenas um exemplo de tarefas complexas e dependentes de recursos externos como conexão com a web, que podem estar definidos dentro do construtor. Algumas vezes é interessante quando não essencial suprimir algum construtor para que você possa prosseguir com os testes da classe. Para suprimir um construtor com PowerMock basta seguir os passos: 1) inclua a classe na e 2) Suprima o construtor. A Listagem 5 mostra como suprimir o construtor padrão da classe SLClient. Listagem 3. Teste do public class SLClient_Test ServicoDeExclusao ServiceLocator public void setup() { when(servicelocator.lookup((class<?>)any())).thenreturn(servicodeexclusao); PowerMockito.mockStatic(ServiceLocator.class); when(servicelocator.getinstance(anystring())).thenreturn(servicelocator); public void executearemotemethod_test() { SLClient client = new SLClient(); client.executearemotemethod(); Listagem 5. Cancelando a execução dos Construtores SL- BaseClient.class) public class SLClient_MockConstrutor_Test { public void setup() { PowerMock.suppress(PowerMock.constructor(SLClient.class)); //... Se a classe tiver mais de um construtor você pode definir qual dos construtores poderá ser suprimido apenas informando os tipos dos parâmetros na chamada do método PowerMock.constructor(). Este é um exemplo caso a classe SLClient além do construtor padrão também tivesse um construtor com uma String como parâmetro. verify(servicodeexclusao).delete(anyobject()); PowerMock.suppress(PowerMock.constructor(SLClient.class, String.class)); Métodos Desabilitando recursos Na Listagem 4 trazemos a saída em console da execução da classe teste SLClient_Test. Menos raros, mas ainda comuns, são os casos em que pode ser necessário desabilitar a execução de alguns métodos. conhecida chamada PowerMock.suppress alterando o parâmetro de 51

5 PowerMock.constructor para PowerMock.method. A segunda é efetuando um PartialMock, onde apenas os métodos declarados serão substituídos. Ambas as implementações obterão o mesmo resultado com a diferença de que utilizando createpartialmock o construtor é substituído, ou seja, ele não é executado. A não ser que seja trocado o método createpartialmock por createpartialmockandinvokedefaultconstructor. Dessa forma fica mais fácil acompanhar o que acontece quando algum recurso é substituído, mesmo apenas tendo o console. em que a equipe de testes do Google escreveu sobre qual o mínimo e o máximo a ser testado em: com/2008/02/in-movie-amadeus-austrian-emperor.html. Se você optou por escolher o primeiro lado, os que acham que testando o método público também estará testando os métodos privados associados a ele, a Listagem 7 é para você. A implementação segue o mesmo modelo de métodos públicos, adicionando duas chamadas: Listagem 6. Cancelando a execução de métodos e utilizando PartialMock para substituir apenas métodos { ServiceLocator.class, SLClient.class ) public class SLClient_Method_Test { //... public void desabilita_metodo_suppress_test() { PowerMock.suppress(PowerMock.method(SLClient.class, getinitializedfromconstructor )); SLClient client = new SLClient(); String a = client.getinitializedfromconstructor(); assertnull(a); client.executedeletemethod(); verify(servicodeexclusao).delete(anyobject()); public void partial_mock_test() { SLClient client = PowerMock.createPartialMock(SLClient.class, getinitializedfromconstructor ); String a = client.getinitializedfromconstructor(); assertnull(a); client.executedeletemethod(); verify(servicodeexclusao).delete(anyobject()); Métodos privados Chegamos a um ponto muito delicado: os métodos privados. Alguns dizem que testar métodos privados é desperdício de tempo, uma vez que os métodos públicos que fazem uso dos métodos privados já são testados e com isso os privados já o são. Outros rebatem dizendo que é muito trabalhoso implementar e manter testes de métodos públicos incluindo as verificações necessárias requeridas. Para este exemplo fizemos uma pequena alteração na classe SL- Client.java. Introduzimos um método privado (iscliente) retornando um booleano. A partir deste retorno é que o serviço de exclusão (service.delete()) do cliente é chamado (Listagem 8). Antes de escolher um lado nesta batalha, dê uma olhada no artigo Listagem 7. Substituição de métodos privados. SLCliente_Method_Test.java. public void notaclient_false_test() throws Exception { SLClient client = PowerMock.createPartialMock(SLClient.class, iscliente ); boolean expectedresult = false; PowerMock.expectPrivate(client, iscliente, cliente 1 ). andreturn(expectedresult); PowerMock.replay(client); client.executedeletemethod(); verifyzerointeractions(servicodeexclusao); Listagem 8. Inclusão do método privado iscliente e utilização do mesmo. SLCliente.java. public void executedeletemethod() { System.out.println( execução de executedeletemethod ); ServicoDeExclusao servico = (ServicoDeExclusao) ServiceLocator. getinstance(slclient.jndi_location_1).lookup(servicodeexclusao.class); String cliente = cliente 1 ; if (iscliente(cliente)) { servico.delete(cliente); else { System.out.println( nothing to do ); private Boolean iscliente(object o) { return o!= null; Utilizando o PowerMock, você também pode chamar métodos privados de fora das classes. Não tão simples quanto se estivesse utilizando Groovy, mas ainda assim possível. A Listagem 9 mostra como fazer. Na Listagem 9, todo o conteúdo do método iscliente foi ignorado, e quando chamado retornará o valor true, ou seja, este é um cliente. Foi introduzida uma nova funcionalidade do framework PowerMock, a classe Whitebox, que será descrita em detalhes mais adiante. 52

6 Listagem 9. Chamada de métodos privados. SLCliente_Method_Test.java public void calling_private_method_test() throws Exception { SLClient client = PowerMock.createPartialMock(SLClient.class, iscliente ); boolean expectedresult = true; PowerMock.expectPrivate(client, iscliente, cliente 1 ). andreturn(expectedresult); PowerMock.replay(client); boolean result = Whitebox.invokeMethod(client, iscliente, cliente 1 ); asserttrue(result); Inicializadores estáticos A motivação para implementação de inicializadores estáticos de classe é a de assegurar que determinado bloco seja executado sempre que esta classe seja inicializada não importando qual construtor utilizado, caso esta tenha mais de um. As motivações para a não utilização variam em torno da quebra de OO e a dificuldade quanto aos testes desta classe. Existe mais de uma alternativa para a não utilização de inicializadores estáticos, a mais simples é incluir todas as chamadas necessárias à inicialização da classe no construtor da classe. Caso a classe possua mais de um construtor e estes possuam uma inicialização em comum, uma alternativa é criar um método de inicialização comum e também sempre usar encadeamento de construtores, quando possível. Alternativas mais elaboradas passam por criação de um Proxy, utilizando InvocationHandler (veja um exemplo da criação de um Proxy nos links de referência deste artigo). Uma solução também poderia ser a utilização do design pattern Builder. Enfim, alternativas para a não utilização de um bloco estático na inicialização de uma classe existem e passam das mais triviais para as mais elaboradas, cabe a você escolher uma. Se estiver na dúvida de qual seria a melhor a ser utilizada, eu sugiro fazer uma prova de conceito de cada alternativa, assim você terá uma real experiência das implementações e do esforço de cada uma diante de seu projeto. Em nosso exemplo, vamos desabilitar a inicialização estática de uma classe. Utilizaremos um construtor padrão para isso, mas um construtor diferente pode ser utilizado sem nenhum tipo de alteração. Para isso, será necessária a inclusão de uma anotação no nível da Atenção para o parâmetro dessa anotação! Esta recebe uma String e não uma classe. A justificativa para tal é de que se for passada uma classe esta será carregada no classloader e inviabilizará a desabilitação do bloco estático. Como tratamos de uma readequação do sistema, o ponto negativo nesta abordagem é que as chances de alterarmos não apenas classes e métodos, mas também a localização de pacotes é muito alta. Se essa alteração ocorrer teremos um erro em tempo de execução dos testes. Para o pessoal que está acostumado a lidar com linguagens dinâmicas como Groovy e Ruby isso não será exatamente um problema. Estamos utilizando como base para a implementação do código de teste a classe SLClient.java. Na Listagem 10 é apresentada a implementação do teste suprimindo a execução do bloco de inicialização estático. Repare que na saída do console, na Listagem 16, não consta o texto informando que passou pelo inicializador estático. Compare as saídas nas Listagens 4 e 11. Na Listagem 11 o texto: Execução da Inicialização Estática de SLClient. não é exibido. Listagem 10. Suprimindo a inicialização estática SLClient_ mj.teste.servicelocator.client.slclient ) public class SLClient_StaticInitializer_Test { public void staticinitialization_suppressed_test() throws Exception { SLClient client = new SLClient(); assertnotnull(client); Listagem 11. Saída produzida pela execução da classe de teste: SLClient_StaticInitializer_Test. Constructor de Base Client Chamada a um WS informando que algum cliente está ativo.. mj.teste.servicelocator.client.slclient Construtor de StClient Chamada a um WS informando que o cliente Cliente está ativo.. mj.teste.servicelocator.client.slclient objetos O PowerMock possui uma classe chamada Whitebox, que é a responsável por fazer o "serviço sujo" de burlar o encapsulamento. Ou seja, literalmente desconsidera toda a modelagem (ou a falta dela) do sistema. Há quem defenda que a utilização de Whitebox é comparada à execução de um projeto utilizando o Maven com a diretiva -DskipTests, isso é jogo sujo! Mas a verdade é que usando Whitebox é possível criar uma classe utilizando o construtor privado da mesma, poderíamos, por exemplo, suprimir a funcionalidade de um singleton. Também é possível chamar um método privado, como mostrado anteriormente. A Listagem 18 faz todo este trabalho sujo. Na Listagem 12 é apresentado o código da nossa classe Cliente. Ela não está tão ruim, mas ainda assim a classe contém o cálculo de idade que é feito baseado no conteúdo da variável yearborn. Queremos externalizar o método privado calculateage(), mas este método está intimamente ligado à classe, fazendo uso da variável de instância yearborn. Portanto, precisamos assegurar que o comportamento deste método esteja 100% testado para depois implementar em outra classe, onde o cálculo de idade pode ser reutilizado para outras localidades do código. 53

7 public class ClientVO { private static String DEFAULT_NAME = NOME PADRAO ; private String name; private String address; private Integer yearborn; private Integer age; public ClientVO(String name, String address, Integer yearborn) { this.setname(name); this.setaddress(address); unused ) private ClientVO() { private int calculateage() { int age = 0; try { Calendar cal = Calendar.getInstance(); int thisyear = cal.get(calendar.year); age = thisyear - this.yearborn; catch (Exception e) { // this is absurd! System.err.println( Ups, erro aqui ); return age; public String getname() { if (name!= null) { return this.name; else { return ClientVO.DEFAULT_NAME; //outros gets e sets O primeiro passo é configurar o calendário para que, quando questionado quanto ao ano atual, este responda que é 2060, sempre. Esta configuração está feita no método setup().estamos fazendo utilização do método mockstatic() junto com when(). O primeiro teste é apenas para nos certificarmos que tudo está OK, que o cálculo de idade está sendo feito quando a classe é criada utilizando o único construtor disponível. O segundo método de teste (privconstructor_privmethod_test()) faz uso da Whitebox para chamar o construtor padrão (invoke- Constructor()) e o método calculateage(invokemethod()). Note que ambos são métodos privados e ainda assim a classe Whitebox é capaz de invocar estes métodos. Como o construtor padrão não idade e atualizar o campo age, este tem seu valor zerado. O último método de teste, privconstructor_changestate_test(), além de instanciar a classe através do construtor privado e chamar o método privado calculateage(), também altera o valor de um campo privado yearborn, através da chamada: Whitebox.setInternalState(). Com este campo preenchido, o resultado da chamada ao método calculateage() deverá ser diferente de zero. - { Calendar.class, ClientVO.class ) public class ClientVO_PrivateConstructor_Test Calendar public void setup() { when(cal.get(calendar.year)).thenreturn(integer.valueof(2060)); PowerMockito.mockStatic(Calendar.class); when(calendar.getinstance()).thenreturn(cal); public void fine_test() throws Exception { final String name = nome ; final String address = endereco ; final Integer yearborn = 2000; ClientVO client = new ClientVO(name, address, yearborn); asserttrue(60 == client.getage().longvalue()); public void privconstructor_privmethod_test() throws Exception { ClientVO client = Whitebox.invokeConstructor(ClientVO.class); Integer age = Whitebox.invokeMethod(client, calculateage ); asserttrue(0 == age); public void privconstructor_changestate_test() throws Exception { ClientVO client = Whitebox.invokeConstructor(ClientVO.class); Integer age = Whitebox.getInternalState(client, age ); assertnull(age); Whitebox.setInternalState(client, yearborn, 2000); asserttrue(2000 == client.getyearborn()); age = Whitebox.invokeMethod(client, calculateage ); asserttrue(60 == age); Algumas vezes a implementação de um único teste nos leva à escrita de algumas dezenas de códigos para a configuração de um ambiente. 54

8 Durante todos os exemplos deste artigo, utilizamos um artifício muito útil do JUnit que é a Uma rápida explicação sobre esta funcionalidade. Antes de executar o conteúdo do teste anotado com, o JUnit executará o código dentro do método anotado Muito útil para configurações genéricas dentro do mesmo cenário de teste, ou mesmo para manter o código de teste livre de configurações. Tomando o nosso último código como exemplo, Listagem 13, vamos fazer algumas modificações a fim de generalizarmos a configuração do cenário de testes. Para os três testes na Listagem 13, é necessário que sempre que o ano, solicitado através da classe Calendar, responda com o valor Na implementação anterior colocamos este comportamento dentro do método setup(), anotado No entanto, gostaríamos de externalizar cada um dos métodos de teste. Seja porque o código de teste ficou muito extenso, ou o objetivo dos testes não esteja vinculado, não faz mais sentido mantê-los na mesma classe. Mesmo assim, precisamos de um comportamento único da classe Calendar. Existem várias opções de solução para este problema. Com Java puro, herança seria o mais indicado, ou então a implementação de um método utilitário que exportasse a data desejada. Nossa solução será utilizando MockPolicy, uma funcionalidade do Powermock. MockPolicies são implementações genéricas que serão inseridas na classe referenciada pela Como parâmetro, a anotação recebe um array de objetos que implementem a interface PowerMockPolicy. Os métodos que devem ser implementados applyclassloading- Policy e applyinterceptionpolicy serão invocados sempre antes do método anotado com, funciona de forma similar Na Listagem 14 você pode ver a implementação de um MockPolicy para o nosso último exemplo, a simulação da classe Calendar e na Listagem 15 você confere a utilização desta Policy. ApplyClassiLoadingPolicy ApplyInterceptionPolicy Informa ao classloader do PowerMock quais classes devem ser modificadas. Neste método devem ser informadas as classes que deveriam constar Efetivamente altera o comportamento das classes informadas no método anterior (applyclassloadingpolicy) Listagem 14. Implementação do MockPolicy public class CalendarYear2kPolicy implements PowerMockPolicy public void applyclassloadingpolicy(mockpolicyclassloadingsettings settings) { settings.addfullyqualifiednamesofclassestoloadbymockclassloader( public void applyinterceptionpolicy(mockpolicyinterceptionsettings settings) { Calendar cal = Calendar.getInstance(); cal.set(calendar.year, 2060); final Method getinstance = Whitebox.getMethod(Calendar.class, getinstance ); settings.stubmethod(getinstance, cal); Listagem 15. Utilização do MockPolicy para a public class ClientVO_MockPolicy_Fine_Test { public void fine_test() throws Exception { final String name = nome ; final String address = endereco ; final Integer yearborn = 2000; ClientVO client = new ClientVO(name, address, yearborn); asserttrue(60 == client.getage().longvalue()); Para Saber Mais Evolução do Design através de Testes e o TDD Edição 41 Autor: Lucas Souza e Paulo Silveira Automação de Testes de Aceitação com Cucumber e JRuby Edição 40 Autor: Demetrius Nunes Automatização de testes de persistência com FIT, DBUnit e HSQLDB Edição 38 Autor: Alexandre Gazola Testes de Unidade Avançados com o JMock 2 Edição 31 Autor: Eduardo Guerra Testes unitários para camadas de negócios no mundo real Edição 23 55

9 Considerações finais Manter ou estender um código desenvolvido nos primórdios da linguagem Java pode ser algo muito difícil, tanto para o desenvolvedor quanto para a empresa, principalmente considerando a alta rotatividade pela insatisfação do programador em lidar com código estagnado ou mesmo quanto ao retrabalho em desenvolver funcionalidades disponíveis em versões mais recentes de frameworks ou bibliotecas de desenvolvimento. Utilizando técnicas de refactoring, com responsabilidade, testando sempre antes de aprimorar determinada funcionalidade, é uma alternativa atraente na batalha de manter o código sempre atualizado, pronto para a utilização dos melhores e mais modernos frameworks e com o mínimo impacto no produto final. Referências Livros Web - austrian-emperor.html html Mock objects são objetos que simulam comportamento de objetos reais. Frequentemente utilizados no desenvolvimento de testes ou quando existe integração entre sistemas e um deles ainda não está disponível para tal integração. Mock Objects possuem características programáveis, como: Lei de Demeter A Lei de Demeter é um caso prático de baixo acoplamento. O conceito básico é de que dado um objeto, o mínimo necessário de conhecimento sobre sua estrutura e propriedades deve ser conhecido. Minha mãe já dizia: Não fale com estranhos. E é exatamente isso que diz a Lei de Demeter. A um objeto só é permitido acessar recursos de objetos conhecidos. Ou seja, objetos declarados dentro da própria classe ou do próprio método. 1. Exemplo de código falando com estranhos Estado estado = cadastrodepessoa.getendereco().getcidade(). getestado(); 2. Exemplo de código sem falar com estranhos Estado estado = cadastrodepessoa.getestado(); 56 Esta afirmação é polêmica. De qualquer forma um Singleton não trata apenas de um assunto, ele trata no mínimo de dois. E esta duplicidade de papéis já é o suficiente para considerá-lo algo não adequado no desenvolvimento de sistemas. Alguns outros motivadores a serem considerados: Isto é uma verdade, assim como qualquer variável estática um começam a aparecer quando surge a necessidade de instalar o software desenvolvido com alguns singletons em um ambiente com cluster. O sistema terá o mesmo comportamento, na aplicação, e isto pode não ser o adequado. Ligação forte entre as classes. Um dos princípios da testabilidade é o baixo acoplamento entre as classes. O baixo acoplamento permite que os objetos sejam mockados de acordo com o cenário que se deseja testar. Utilizando um singleton você está ligando fortemente à implementação da classe com o comportamento do Singleton. Não é impossível, mas ao menos muito mais trabalhoso de implementar e manter os testes de classes dependentes de Singleton. Existem vantagens e desvantagens em se aplicar a Lei de Demeter. Uma grande vantagem é que o código fica menos dependente da estrutura interna, mais legível e com isso manutenível. Uma desvantagem é que algumas vezes é necessário escrever mais código apenas para externalizar algumas funcionalidades Wrappers como feito no exemplo. Princípio da Responsabilidade Única O conceito da Responsabilidade Única prega que cada objeto deve ter apenas uma responsabilidade e que esta responsabilidade deve estar completamente encapsulada na classe. Todos os serviços devem estar alinhados com a responsabilidade daquela classe. Este termo foi introduzido por Robert Martin Uncle Bob

Testes com objetos mock. Curso de Tecnologia em Análise e Desenvolvimento de Sistemas Análise e Projeto Orientados a Objetos

Testes com objetos mock. Curso de Tecnologia em Análise e Desenvolvimento de Sistemas Análise e Projeto Orientados a Objetos Testes com objetos mock Curso de Tecnologia em Análise e Desenvolvimento de Sistemas Análise e Projeto Orientados a Objetos Introdução Testes são essenciais para garantir a qualidade do código. No entanto:

Leia mais

Classes e Objetos. Sintaxe de classe em Java

Classes e Objetos. Sintaxe de classe em Java Classes e Objetos Classes e Objetos A Programação Orientada a Objetos (POO) é uma técnica de programação que se baseia na construção de classes e utilização de objetos. Os objetos são formados por dados

Leia mais

Teste Automatizado POO. Prof. Marcio Delamaro

Teste Automatizado POO. Prof. Marcio Delamaro Teste Automatizado POO Prof. Marcio Delamaro 1/51 Teste Ato de executar um programa e verificar se os resultados produzidos estão corretos Manual: realizado passando-se os parâmetros e olhando se o resultado

Leia mais

Programação Orientada a Objetos. Professor: André Luis Meneses Silva br.geocities.com/programacao2ufs

Programação Orientada a Objetos. Professor: André Luis Meneses Silva br.geocities.com/programacao2ufs Programação Orientada a Objetos Professor: André Luis Meneses Silva andreluis.ms@gmail.com br.geocities.com/programacao2ufs [ Conteúdo ] Objeto Mensagens Classe Encapsulamento Visibilidade Membros de Instância

Leia mais

Objetos Dublês. Mariana Bravo AgilCoop Cursos de Verão 2009

Objetos Dublês. Mariana Bravo AgilCoop Cursos de Verão 2009 Objetos Dublês Mariana Bravo marivb@agilcoop.org.br AgilCoop Cursos de Verão 2009 Motivação Testes de unidade focam em uma unidade Mas as unidades do sistema têm dependências entre si Dublês oferecem uma

Leia mais

Tratando exceções em Java

Tratando exceções em Java Página 1 de 9 En Tecnologias Revistas Cursos Pocket videos DevWare Fórum Serviços Publicar Comprar Bem vindo a DevMedia! LOGIN: SENHA: Esqueci minha senha Cadastre-se post favorito comentários Tratando

Leia mais

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos Programação Orientada a Objetos Vagner Luz do Carmo - Vluzrmos Questão 1 Dada a seguinte classe na linguagem JAVA: public class Carro { public String retornacor(){ ; return Azul ; private String retornachassi(){

Leia mais

Objetos Dublês. AgilCoop Cursos de Verão Mariana Bravo IME/USP

Objetos Dublês. AgilCoop Cursos de Verão Mariana Bravo IME/USP Objetos Dublês AgilCoop Cursos de Verão 2010 Mariana Bravo IME/USP Motivação Testes de unidade focam em uma unidade Mas as unidades do sistema têm dependências entre si Dublês oferecem uma maneira de isolar

Leia mais

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... } Recapitulando Orientação a objetos: programas organizados em torno da definição de classes, instanciação de objetos e troca de mensagens. Declaração de variáveis de referencia: Circle c; Criação/instanciação

Leia mais

Testes Unitários em Java

Testes Unitários em Java Laboratório de Programação Março 2016 Testes Unitários uma unidade pode ser uma função, uma classe um package ou um sub-sistema. cada teste unitário tem como objectivo verificar uma propriedade comportamental

Leia mais

Laboratório de programação II

Laboratório de programação II Laboratório de programação II Herança e Polimorfismo Edson Moreno edson.moreno@pucrs.br http://www.inf.pucrs.br/~emoreno Herança Mecanismo da Orientação a Objeto que permite criar novas classes aproveitando

Leia mais

Abstract Factory. Prover uma interface para criar uma família de objetos relacionados ou dependentes sem especificar suas classes concretas

Abstract Factory. Prover uma interface para criar uma família de objetos relacionados ou dependentes sem especificar suas classes concretas Objetivo Prover uma interface para criar uma família de objetos relacionados ou dependentes sem especificar suas classes concretas Também chamado de Kit Resumo Parece semelhante ao padrão Factory Method,

Leia mais

Linguagem de Programação II Implementação

Linguagem de Programação II Implementação Linguagem de Programação II Implementação Prof. Alessandro Borges 2 Tópicos Implementação em Java Variáveis Palavras reservadas Pacotes Identificador this Acessando membros de outros objetos API Java Nossa

Leia mais

Modificadores de Acesso e Atributos de Classe

Modificadores de Acesso e Atributos de Classe Modificadores de Acesso e Atributos de Classe 1 Controlando o acesso p Um dos problemas mais simples que temos no nosso sistema de contas é que o método saca permite sacar mesmo que o limite tenha sido

Leia mais

Orientação a Objetos AULA 09

Orientação a Objetos AULA 09 Orientação a Objetos AULA 09 Prof. Fabrício Martins Mendonça Conteúdo da Aula ü Coleções ü Coleções lista de objetos ü Coleções conjuntos 2 Coleções Podemos armazenar vários objetos em um array e este

Leia mais

Singleton. Como a maioria dos programadores organizaria o código para acessar informação de configuração? Eis um exemplo:

Singleton. Como a maioria dos programadores organizaria o código para acessar informação de configuração? Eis um exemplo: Introdução Como a maioria dos programadores organizaria o código para acessar informação de configuração? Eis um exemplo: public class Config { public static final String DEFAULT_READ_COMMUNITY_NAME =

Leia mais

Collections Framework

Collections Framework Collections Framework 1 Arrays p Manipular array é bastante trabalhoso. p Dificuldades aparecem em diversos momentos: n não podemos redimensionar um array em Java; n é impossível buscar diretamente por

Leia mais

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objectos - P. Prata, P. Fazendeiro 3 Classes e instanciação de objectos (em Java) Suponhamos que queremos criar uma classe que especifique a estrutura e o comportamento de objectos do tipo Contador. As instâncias da classe Contador devem

Leia mais

Testes Unitários com JUnit

Testes Unitários com JUnit Testes Unitários com JUnit Por: Luiz Gustavo Stábile de Souza http://luizgustavoss.wordpress.com Abril/2009 Motivação Apesar de já fazer um certo tempo que escrevi a primeira versão deste tutorial, o assunto

Leia mais

Engenharia de Software Aula 21. Revisão da Prova 2. Eduardo Figueiredo.

Engenharia de Software Aula 21. Revisão da Prova 2. Eduardo Figueiredo. Engenharia de Software Aula 21 Revisão da Prova 2 Eduardo Figueiredo http://www.dcc.ufmg.br/~figueiredo dcc603@dcc.ufmg.br 16 Maio 2018 Aula 16: POO Um programa OO é geralmente constituído de várias classes

Leia mais

Introdução à Programação Orientada a Objetos. Programação Estruturada vs Programação Orientada a Objetos

Introdução à Programação Orientada a Objetos. Programação Estruturada vs Programação Orientada a Objetos Introdução à Programação Orientada a Objetos O desenvolvimento de software é extremamente amplo. Nesse mercado, existem diversas linguagens de programação, que seguem diferentes paradigmas. Um desses paradigmas

Leia mais

JAVA TÓPICOS ESPECIAIS DE PROGRAMACAO ORIENTADA A OBJETOS

JAVA TÓPICOS ESPECIAIS DE PROGRAMACAO ORIENTADA A OBJETOS JAVA TÓPICOS ESPECIAIS DE PROGRAMACAO ORIENTADA A OBJETOS LABORATÓRIO 2 PROF. EMILIO PARMEGIANI Neste laboratório trabalharemos com conceitos de orientação a objetos, através da criação de classes, propriedades,

Leia mais

Desenvolva de qualquer sistema operacional para qualquer sistema operacional. Sem limites.

Desenvolva de qualquer sistema operacional para qualquer sistema operacional. Sem limites. Desenvolva de qualquer sistema operacional para qualquer sistema operacional. Sem limites. Gabriel Pereira, Especialista em Java da Clarify Projete e desenvolva situações de Mercado com a criação de um

Leia mais

Enums em Java: utilização e persistência

Enums em Java: utilização e persistência Enums em Java: utilização e persistência Jadson José dos Santos jadsonjs@gmail.com Nas primeiras versões da linguagem Java, a única forma que existia para se utilizar constantes enumeradas era através

Leia mais

TÉCNICAS DE ORIENTAÇÃO A OBJETOS

TÉCNICAS DE ORIENTAÇÃO A OBJETOS TÉCNICAS DE ORIENTAÇÃO A OBJETOS APLICAÇÃO EM: C# E JAVA Sumário INTRODUÇÃO... 4 PARADIGMAS DE PROGRAMAÇÃO... 5 PROGRAMAÇÃO PROCEDURAL... 5 PROGRAMAÇÃO ESTRUTURADA... 5 PROGRAMAÇÃO ORIENTADA A OBJETOS...

Leia mais

Esta categoria mais geral, à qual cada objeto pertence, denominamos de classe; IFSC/POO + JAVA - prof. Herval Daminelli

Esta categoria mais geral, à qual cada objeto pertence, denominamos de classe; IFSC/POO + JAVA - prof. Herval Daminelli Esta categoria mais geral, à qual cada objeto pertence, denominamos de classe; Tudo no mundo real pode ser representado por meio do conceito de "objeto": uma planta, uma mesa, uma pessoa, um sentimento,

Leia mais

Linguagem de Programação III

Linguagem de Programação III Linguagem de Programação III Aula-7 Reutilização de Classes Prof. Esbel Tomás Valero Orellana Até Aqui Introdução a POO e sua implementação em Java Atributos, métodos e encapsulamento dos mesmos Trabalhando

Leia mais

Organizando seus Testes Funcionais AUMENTANDO A MANUTENIBILIDADE DE TESTES FUNCIONAIS ATRAVÉS DA ORIENTAÇÃO A OBJETOS.

Organizando seus Testes Funcionais AUMENTANDO A MANUTENIBILIDADE DE TESTES FUNCIONAIS ATRAVÉS DA ORIENTAÇÃO A OBJETOS. page objects_ PAGE OBJECTS Organizando seus Testes Funcionais AUMENTANDO A MANUTENIBILIDADE DE TESTES FUNCIONAIS ATRAVÉS DA ORIENTAÇÃO A OBJETOS. Testes são parte fundamental do processo de desenvolvimento

Leia mais

Padrões de Projeto. Padrões de Projeto. Além dos 23 Padrões GoF. Os 23 Padrões de Projeto. Documentação de um Padrão. Classificação dos Padrões

Padrões de Projeto. Padrões de Projeto. Além dos 23 Padrões GoF. Os 23 Padrões de Projeto. Documentação de um Padrão. Classificação dos Padrões DCC / ICEx / UFMG Padrões de Projeto Padrões de Projeto Eduardo Figueiredo http://www.dcc.ufmg.br/~figueiredo Um padrão é uma descrição do problema e a essência da sua solução Documenta boas soluções para

Leia mais

JUnit. Alexandre Menezes Silva Eduardo Manuel de Freitas Jorge

JUnit. Alexandre Menezes Silva Eduardo Manuel de Freitas Jorge JUnit Alexandre Menezes Silva alexandre_crvg@hotmail.com Eduardo Manuel de Freitas Jorge emjorge1974@gmail.com 0 Sumário O que é?... 2 Pra que serve?... 2 Arquitetura... 2 Método de comparação assertequals...

Leia mais

J820. Mock objects. Testes de código com dependências. argonavis.com.br. Helder da Rocha

J820. Mock objects. Testes de código com dependências. argonavis.com.br. Helder da Rocha J820 Mock objects Testes de código com dependências Helder da Rocha (helder@acm.org) Como lidar com testes difíceis Testes devem ser simples e suficientes Comece com testes mais importantes Sempre pode-se

Leia mais

ASSOCIAÇÃO ENTRE CLASSES

ASSOCIAÇÃO ENTRE CLASSES Cursos: Análise, Ciência da Computação e Sistemas de Informação Programação I - Prof. Aníbal Notas de aula 5 ASSOCIAÇÃO ENTRE CLASSES O objetivo deste texto é rever, um pouco mais detidamente, o relacionamento

Leia mais

String. Demonstrar a utilização e manipulação com os métodos da classe String.

String. Demonstrar a utilização e manipulação com os métodos da classe String. String 1. Objetivos Demonstrar a utilização e manipulação com os métodos da classe String. 2. Strings 2.1. O que são Strings? Em Java, String é uma seqüência de caracteres utilizada para representação

Leia mais

COMPORTAMENTOS - Observações

COMPORTAMENTOS - Observações COMPORTAMENTOS - Observações O próprio objeto realiza operações de consulta ou alteração dos valores dos seus atributos Essas operações são definidas em seus métodos Os métodos também são utilizados para

Leia mais

Classes e Objetos. Prof. Fernando V. Paulovich 9 de agosto de 2010

Classes e Objetos. Prof. Fernando V. Paulovich  9 de agosto de 2010 Classes e Objetos SCC0604 - Programação Orientada a Objetos Prof. Fernando V. Paulovich http://www.icmc.usp.br/~paulovic paulovic@icmc.usp.br Instituto de Ciências Matemáticas e de Computação (ICMC) Universidade

Leia mais

CIÊNCIA DA COMPUTAÇÃO - LINGUAGEM DE PROGRAMAÇÃO II REVISÃO POO

CIÊNCIA DA COMPUTAÇÃO - LINGUAGEM DE PROGRAMAÇÃO II REVISÃO POO REVISÃO POO INTRODUÇÃO À LINGUAGEM JAVA CRIANDO CLASSES EM JAVA Convenção de Nomes em Java Classes iniciam com letras maiúsculas Métodos, atributos e variáveis locais iniciam com minúsculas. Declaração

Leia mais

Interfaces POO. Prof. Marcio Delamaro

Interfaces POO. Prof. Marcio Delamaro Interfaces POO Prof. Marcio Delamaro Programação Orientada a Objetos Prof Marcio Delamaro ICMC/USP 1/41 O que é interface É um template de classe Outras classes podem seguir esse template Chamamos isso

Leia mais

Desenvolvendo aplicações de qualidade com TDD

Desenvolvendo aplicações de qualidade com TDD 23 de junho, 2016 Desenvolvendo aplicações de qualidade com TDD Huge Isabella Silveira Web Engineer @ Huge. Front-End, Back-End, Agile e Integração Contínua. Agenda. 1. Introdução 2. O que é TDD? 3. Por

Leia mais

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS Data final de entrega 16/09/2014, até às 23h59min Enviar o arquivo de respostas em formato PDF e o arquivozip com códigos fontes para o e-mail motafernandomaia@gmailcom, insira no assunto do e-mail [Lista

Leia mais

Singleton e Adapter. Professor: Nazareno Andrade (baseado no material de Hyggo Almeida e Jacques Sauvé)

Singleton e Adapter. Professor: Nazareno Andrade (baseado no material de Hyggo Almeida e Jacques Sauvé) e Adapter Professor: Nazareno Andrade (baseado no material de Hyggo Almeida e Jacques Sauvé) O que vimos na última aula? Factory Method Abstract Factory 2 O que veremos hoje? (padrão de criaçã) Adapter

Leia mais

Controlando Erros com Exceções

Controlando Erros com Exceções Controlando Erros com Exceções 1 Motivação p O que aconteceria ao tentar chamar o método saca com um valor fora do limite? p O sistema mostraria uma mensagem de erro, mas quem chamou o método saca não

Leia mais

Notas de Aula 09: Tratamento de exceções

Notas de Aula 09: Tratamento de exceções Notas de Aula 09: Tratamento de exceções Objetivos da aula: Compreender o conceito de exceção Aprender a tratar exceções nos programas Entender a hierarquia das exceções Criar e lançar uma exceção proprietária

Leia mais

Linguagem de Programação III

Linguagem de Programação III Linguagem de Programação III Aula-4 Construtores e Sobrecarga Prof. Esbel Tomás Valero Orellana Até Aqui Modelos e POO Classes e sua implementação em Java Encapsulamento Tipos de dados nativos em Java

Leia mais

Programação por Objectos. Java

Programação por Objectos. Java Programação por Objectos Java Parte 7: Interfaces LEEC@IST Java 1/31 Interfaces revisão (1) Uma interface é um conjunto de protótipos de métodos (sem implementações) que especifica um serviço bem definido:

Leia mais

Herança. Herança. Herança. Herança. Herança. Programação Orientada a Objetos

Herança. Herança. Herança. Herança. Herança. Programação Orientada a Objetos e Ligação Dinâmica Programação Orientada a Objetos e Polimorfismo A é a contribuição original do paradigma de programação orientado a objetos Fundamentos chave do paradigma OO: Abstração de Dados A herança

Leia mais

Paradigmas de Linguagens de Programação. Suporte para Programação Orientada a Objeto

Paradigmas de Linguagens de Programação. Suporte para Programação Orientada a Objeto Suporte para Programação Orientada a Objeto Cristiano Lehrer Categoria das Linguagens que Suportam POO Suporte a POO acrescentado a uma linguagem já existente: C++ (também suporta programação procedural

Leia mais

1 Introdução e Conceitos básicos

1 Introdução e Conceitos básicos 1 Introdução e Conceitos básicos Aula 02 Sumário Capítulo 1 Introdução e Conceitos básicos 1.1 Modelos 1.2 Tipos primitivos de dados 1.3 Tipo Abstrato de dados 1.4 Orientação a Objetos 1.4.1 Classe 1.4.2

Leia mais

C com introdução a OO

C com introdução a OO ... Centro Integrado de Tecnologia da Informação C com introdução a OO ... Centro Integrado de Tecnologia da Informação Aula 9 Ronald Dener - Instrutor Matheus Soares - Monitor 17 / outubro 17 / outubro

Leia mais

Unidade: sobrecarga, construtores e herança

Unidade: sobrecarga, construtores e herança Unidade: sobrecarga, construtores e herança 0 Unidade: sobrecarga, construtores e herança Sobrecarga Sobrecarregar (do inglês overload) um método é criar mais métodos com o mesmo nome, porém com assinaturas

Leia mais

Computação II Orientação a Objetos

Computação II Orientação a Objetos Computação II Orientação a Objetos Fabio Mascarenhas - 2014.1 http://www.dcc.ufrj.br/~fabiom/java Interfaces Uma interface é uma forma abstrata de descrever um objeto A classe fixa a forma de um objeto

Leia mais

Testes Automatizados. Cursos de Verão 2007 IME/USP Dairton Bassi & Paulo Cheque

Testes Automatizados. Cursos de Verão 2007 IME/USP   Dairton Bassi & Paulo Cheque Testes Automatizados Cursos de Verão 2007 IME/USP www.agilcoop.org.br Dairton Bassi & Paulo Cheque Roteiro 1) Motivação 2) Introdução a Testes 3) Testes de Unidade 4) Testes de Aceitação 5) Testes de Integração

Leia mais

Introdução ao Teste Unitário com JUnit

Introdução ao Teste Unitário com JUnit Introdução ao Teste Unitário com JUnit Agenda Testes de Unidade Junit Primeiro Teste Executando testes com Junit e NetBeans Passos para criação de testes unitários Testes de Unidade Testes de unidade são

Leia mais

RESULUÇÃO DOS EXERCÍCIOS E INSTRUÇÕES DE DECISÃO (if{} e else{}) Profº André Aparecido da Silva Disponível em:

RESULUÇÃO DOS EXERCÍCIOS E INSTRUÇÕES DE DECISÃO (if{} e else{}) Profº André Aparecido da Silva Disponível em: RESULUÇÃO DOS EXERCÍCIOS E INSTRUÇÕES DE DECISÃO (if{} e else{}) Profº André Aparecido da Silva Disponível em: http://www.oxnar.com.br/aulas/java ATIVIDADE ELABORAR O PROGRAMA DE CÁLCULOS DE ÁREAS USANDO

Leia mais

Algoritmos e Programação 2. Objetos e Classes em Java. Classes. Revisão. Definições de classes incluem (geralmente):

Algoritmos e Programação 2. Objetos e Classes em Java. Classes. Revisão. Definições de classes incluem (geralmente): Algoritmos e Programação 2 Baseado no material do Prof. Júlio Machado Objetos e Classes em Java Revisão Classes: encapsulam dados (atributos) e operações sobre os dados (métodos) Objetos: instâncias de

Leia mais

Engenharia de Software

Engenharia de Software UNIVERSIDADE DE LISBOA INSTITUTO SUPERIOR TÉCNICO Engenharia de Software LEIC/LETI, 3 o Ano, 2 o Semestre 1 o Teste, 10 de Abril de 2018 Duração: 90 minutos Nome: Número: Este teste tem um conjunto de

Leia mais

Java para Desktop. Programação Orientada à Objetos 2 JSE

Java para Desktop. Programação Orientada à Objetos 2 JSE Java para Desktop Programação Orientada à Objetos 2 JSE Encapsulamento significa "ocultar informações, ele define que cada objeto contém todos os detalhes de implementação necessários sobre como ele funciona

Leia mais

Interfaces. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Interfaces. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno. Interfaces Universidade Católica de Pernambuco Ciência da Computação Prof. Márcio Bueno poonoite@marciobueno.com Fonte: Material da Profª Karina Oliveira Interfaces É utilizada para agrupar conceitos em

Leia mais

Programação Orientada a Objetos

Programação Orientada a Objetos Ciência da Computação Prof. Elias Ferreira Elaborador por: Ana Claudia Bastos Loureiro Monção JUNIT Teste de Software Processo de Software Um processo de software pode ser visto como o conjunto de atividades,

Leia mais

Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz /05/13. Questão: Total Pontos: Gráu:

Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz /05/13. Questão: Total Pontos: Gráu: Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz - 2015/05/13 Questão: 1 2 3 4 5 6 Total Pontos: 20 15 15 10 10 30 100 Gráu: 1. Defina os termos listados a seguir: (a) (10 Pontos)

Leia mais

Análise e Projeto Orientados por Objetos

Análise e Projeto Orientados por Objetos Análise e Projeto Orientados por Objetos Aula 05 Padrões GoF (Singleton e Iterator) Edirlei Soares de Lima Padrões GoF Criação: Abstract Factory Builder Factory Method Prototype

Leia mais

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III Programação Orientada a Objetos Alexandre César Muniz de Oliveira Métodos e Atributos Parte III Métodos [mod] tipo nome ([tipo arg]) [throws exc]{ [mod]: zero ou mais modificadores separados por espaços

Leia mais

A classe ArrayList. IFSC/Florianópolis - Programação Orientada a Objetos com Java - prof. Herval Daminelli

A classe ArrayList. IFSC/Florianópolis - Programação Orientada a Objetos com Java - prof. Herval Daminelli A classe ArrayList Java oferece uma classe chamada ArrayList, que permite a criação e manipulação de objetos; Um objeto ArrayList é semelhante a um vetor de objetos, mas oferece inúmeras vantagens em relação

Leia mais

Lista de Linguagens de Programação 14

Lista de Linguagens de Programação 14 Lista de Linguagens de Programação 14 Nome: Matrícula: 1. Existem três formas de alocação de memória: memória estática, memória de pilha e alocação em heap. Enquanto endereços estáticos são conhecidos

Leia mais

Tópicos da Aula. POO e Padrões de Projetos. Considere três classes... Reuso de Classes. Locadora de DVD. Sistema Acadêmico

Tópicos da Aula. POO e Padrões de Projetos. Considere três classes... Reuso de Classes. Locadora de DVD. Sistema Acadêmico Reuso de Software Aula 03 Tópicos da Aula POO e Padrões de Projetos Eduardo Figueiredo http://www.dcc.ufmg.br/~figueiredo reuso.software@gmail.com 12 Março 2012 Programação orientada a objetos Reuso de

Leia mais

Programação Orientada a Objetos. Aula 1.9 this e static. Prof. Bruno Moreno

Programação Orientada a Objetos. Aula 1.9 this e static. Prof. Bruno Moreno Programação Orientada a Objetos Aula 1.9 this e static Prof. Bruno Moreno bruno.moreno@ifrn.edu.br Relembre: Clase RoboSimples Os métodos move() e move(int passos) podem ser reescrito sem redundância de

Leia mais

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação 4 Conceito de Herança Hierarquia de classes e mecanismo de ligação Herança Uma classe pode herdar operações de uma superclasse e as suas operações podem ser herdadas por subclasses. O mecanismo de herança

Leia mais

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS Departamento de Informática PUC-Rio Ivan Mathias Filho ivan@inf.puc-rio.br Programa Capítulo 3 Ponteiros e Variáveis de Objeto Construtores e Blocos de Inicialização

Leia mais

October 13, 2016 Web.br hugeinc.com

October 13, 2016 Web.br hugeinc.com October 13, 2016 Web.br hugeinc.com 13 de outubro, 2016 Desenvolvendo aplicações de qualidade com TDD Huge Isabella Silveira Web Engineer @ Huge. Front-End, Back-End, Agile e Integração Contínua. Agenda.

Leia mais

Boas práticas com Orientação a Objetos. Paulo Silveira

Boas práticas com Orientação a Objetos. Paulo Silveira Boas práticas com Orientação a Objetos Paulo Silveira paulo.silveira@caelum.com.br Rapidissímo overview IFs e switches X herança Vantagens e desvantagens do uso de Herança Casos errados do uso de herança

Leia mais

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes - Programação Java - Herança, Classes Abstratas e Interfaces - Marco Fagundes mfagundes@tre-pa.gov.br 1 Tópicos Herança Ligação Dinâmica Polimorfismo 2 Herança Herança é um conceito que mapeia as classes

Leia mais

p Imagine que um Sistema de Controle do Banco pode ser acessado, além dos Gerentes, pelos Diretores do Banco

p Imagine que um Sistema de Controle do Banco pode ser acessado, além dos Gerentes, pelos Diretores do Banco 1 Expandindo o Sistema p Imagine que um Sistema de Controle do Banco pode ser acessado, além dos Gerentes, pelos Diretores do Banco class Diretor extends Funcionario { public boolean autentica(int senha)

Leia mais

Programação Java. Tratamento de Exceções

Programação Java. Tratamento de Exceções Programação Java Tratamento de Exceções Grupo de Linguagens de Programação Departamento de Informática PUC-Rio Motivações para Exceções Um método pode detectar uma falha mas não estar apto a resolver sua

Leia mais

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS Departamento de Informática PUC-Rio Andrew Diniz da Costa andrew@les.inf.puc-rio.br Programa Capítulo 3 Ponteiros e Variáveis de Objeto Construtores

Leia mais

Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos II Prof. Fabiano Dorça. Padrão Observer (Observador)

Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos II Prof. Fabiano Dorça. Padrão Observer (Observador) Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos II Prof. Fabiano Dorça Problema: Definir uma dependência um-para-muitos entre objetos, de forma quando o estado

Leia mais

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objectos - P. Prata, P. Fazendeiro 9 Classes Abstractas e Interfaces Classe Abstracta Classe em que pelo menos um dos métodos de instância não é implementado. Exemplo: public abstract class Forma{ public abstract double area(); public abstract

Leia mais

Herança. Fátima L. S. Nunes Luciano A. Digiampietri Norton T. Roman SISTEMAS DE INFORMAÇÃO 1

Herança. Fátima L. S. Nunes Luciano A. Digiampietri Norton T. Roman SISTEMAS DE INFORMAÇÃO 1 Herança Fátima L. S. Nunes Luciano A. Digiampietri Norton T. Roman 1 1 1 Motivação Você está desenvolvendo um sistema de gerenciamento de pessoal para a USP Precisa fazer: Cadastro de alunos e professores

Leia mais

Injeção de Dependências e Spring

Injeção de Dependências e Spring Injeção de Dependências e Spring Daniel Cukier Prof. Fabio Kon IME-USP Conteúdo Exemplo Melhor maneira de aprender Injeção de Dependência (DI) Spring Service Locator Daniel Cukier - IME/USP 2/29 Exemplo

Leia mais

Computação II Orientação a Objetos

Computação II Orientação a Objetos Computação II Orientação a Objetos Fabio Mascarenhas - 2016.2 http://www.dcc.ufrj.br/~fabiom/java Revisão Classes e Objetos Classes são uma das unidades básicas de um programa Java Usamos as classes para

Leia mais

Linguagem de Programação II Implementação

Linguagem de Programação II Implementação Linguagem de Programação II Implementação Prof. Alessandro Borges 2 Tópicos Criando objeto Definindo valores para os atributos do objeto Método construtor Definindo valores padrão para os atributos dos

Leia mais

Computação II Orientação a Objetos

Computação II Orientação a Objetos Computação II Orientação a Objetos Fabio Mascarenhas - 2014.1 http://www.dcc.ufrj.br/~fabiom/java Breakout Componentes do Breakout Bola Raquete Tijolos Paredes Score Nem todos vão precisar de classes próprias

Leia mais

Teste de Software Orientado a Objeto. Ricardo Argenton Ramos

Teste de Software Orientado a Objeto. Ricardo Argenton Ramos Teste de Software Orientado a Objeto Ricardo Argenton Ramos O que diferencia teste de software OO de testes Convencionais? Técnicas e abordagens são normalmente semelhantes, porém novos desafios são apresentados

Leia mais

Linguagem de Programação III

Linguagem de Programação III Linguagem de Programação III Aula-5 Estruturas de Decisão e Controle. Arrays em Java Prof. Esbel Tomás Valero Orellana Até Aqui Modelos e POO Classes e sua implementação em Java Encapsulamento Tipos de

Leia mais

Aula 4 Encapsulamento e Relacionamento Cleverton Hentz

Aula 4 Encapsulamento e Relacionamento Cleverton Hentz Aula 4 Encapsulamento e Relacionamento Cleverton Hentz Sumário } Encapsulamento } Propriedades } Relacionamentos } Composição } Herança 2 O que é encapsulamento? } O que vocês entendem por encapsular?!

Leia mais

Visibilidade e Encapsulamento

Visibilidade e Encapsulamento Visibilidade e Encapsulamento Professor: Ricardo Luis dos Santos IFSUL 2016 Agenda Pacotes Visibilidade Encapsulamento Hands-On 2 Pacotes Em Java, a visibilidade ou grau de acesso a um determinado atributo

Leia mais

Classe Interna (Inner)

Classe Interna (Inner) Classe Interna (Inner) Primeira versão da linguagem não possuia esse conceito, autores consideravam um complicador para linguagem; A partir da versão 1.1 o conceito foi introduzido; Verificou-se que o

Leia mais

9 Classes Abstractas e Interfaces

9 Classes Abstractas e Interfaces 9 Classes Abstractas e Interfaces Classe Abstracta Classe em que pelo menos um dos métodos de instância não é implementado. Exemplo: public abstract class Forma{ public abstract double area(); public abstract

Leia mais

Programação Orientada a Objetos. SANTOS, Rafael (PLT) e Guia de Estudo SCJP. SIERRA, Kathy e BATES, Bert

Programação Orientada a Objetos. SANTOS, Rafael (PLT) e Guia de Estudo SCJP. SIERRA, Kathy e BATES, Bert Programação Orientada a Objetos. SANTOS, Rafael (PLT) e Guia de Estudo SCJP. SIERRA, Kathy e BATES, Bert Há situações em que não deve haver instâncias de determinadas classes Há modelos incompletos que

Leia mais

Unidade 7: Documentação de Código A Importância dos Comentários Prof. Daniel Caetano

Unidade 7: Documentação de Código A Importância dos Comentários Prof. Daniel Caetano Linguagem de Programação 1 Unidade 7: Documentação de Código A Importância dos Comentários Prof. Daniel Caetano Objetivo: Desenvolver a habilidade de comentar código adequadamente INTRODUÇÃO Até o momento

Leia mais

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objectos - P. Prata, P. Fazendeiro 7 Classes Abstractas e Interfaces Classe Abstracta Classe em que pelo menos um dos métodos de instância não é implementado. Exemplo: public abstract class Forma{ public abstract double area(); public abstract

Leia mais

Java Standard Edition (JSE)

Java Standard Edition (JSE) Java Standard Edition (JSE) Capítulo 05. Encapsulamento, Modificadores de acesso e atributos de classe Esp. Márcio Palheta MSN: marcio.palheta@hotmail.com 1 Agenda Revisão da aula anterior; Motivação Organização;

Leia mais

Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação

Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação Introdução Além de utilizar as classes presentes na biblioteca padrão, programadores podem definir suas próprias

Leia mais

Tipos, Literais, Operadores

Tipos, Literais, Operadores Tipos, Literais, Operadores Identificadores São palavras utilizadas para nomear variáveis, métodos e classes Na linguagem Java, o identificador sempre começa por letra, sublinhado(_) ou cifrão ($) Não

Leia mais

Tipos, Literais, Operadores

Tipos, Literais, Operadores Tipos, Literais, Operadores Identificadores São palavras utilizadas para nomear variáveis, métodos e classes Na linguagem Java, o identificador sempre começa por letra, sublinhado(_) ou cifrão ($) Não

Leia mais

Tratamento de Exceções

Tratamento de Exceções Tratamento de Exceções Carlos Bazilio Isabel Rosseti Depto de Ciência e Tecnologia Pólo Universitário de Rio das Ostras Universidade Federal Fluminense Motivação prever na implementação do sistema situações

Leia mais

Padrões de Testes Automatizados

Padrões de Testes Automatizados Padrões de Testes Automatizados Paulo Cheque 10/02/2009 Verão2009 2 Introdução Testes codificados Exigem boa programação Mesmos problemas de um software Devem receber o mesmo tratamento Exigem manutenção

Leia mais

Programação. Orientada a Objetos: Herança. Objetos. Relacionamento entre classes. Análise e Projeto Orientados a. Objetos

Programação. Orientada a Objetos: Herança. Objetos. Relacionamento entre classes. Análise e Projeto Orientados a. Objetos Programação Orientada a Objetos: Herança Alexandre César Muniz de Oliveira Análise e Projeto Orientados a Objetos A análise orientada a objetos Determina o que o sistema deve fazer: Quais os atores envolvidos?

Leia mais

AULA 8 Polimorfismo de: coerção, overloading, inclusão e paramétrico Prof. Dr. Fernando Henrique Campos

AULA 8 Polimorfismo de: coerção, overloading, inclusão e paramétrico Prof. Dr. Fernando Henrique Campos Câmpus Santa Helena Curso: Ciência da Computação Disciplina: Programação Orientada a Objetos AULA 8 Polimorfismo de: coerção, overloading, inclusão e paramétrico Prof. Dr. Fernando Henrique Campos Tema

Leia mais