<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-5957108997418726971</atom:id><lastBuildDate>Sun, 08 Sep 2024 01:09:05 +0000</lastBuildDate><category>java</category><category>SQL</category><category>Spring</category><category>TDD</category><category>database</category><category>BDD</category><category>DBUnit</category><category>HTML</category><category>NPM</category><category>git</category><category>hibernate</category><category>performance</category><title>Code Reverse</title><description></description><link>http://codereverse.blogspot.com/</link><managingEditor>noreply@blogger.com (Unknown)</managingEditor><generator>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5957108997418726971.post-250346524268087401</guid><pubDate>Thu, 28 May 2020 01:04:00 +0000</pubDate><atom:updated>2020-05-27T22:12:08.830-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">git</category><category domain="http://www.blogger.com/atom/ns#">HTML</category><title>Como utilizar o GitHub Pages</title><description>&lt;div&gt;
Como dar vida ao seu repositório no GitHub com GitHub Pages.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Pra mim uma das partes mais interessantes, empolgantes de trabalhar em um projeto é em sua conclusão vê-lo funcionando.&lt;br /&gt;
O
GitHub Pages se torna assim um local de fácil acesso para publicações
 e com uma url conhecida, que vincula o desenvolvedor ao produto do seu 
trabalho, tudo isso sem custo, para projetos open source.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Requisitos:&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Um repositório no github&lt;/li&gt;
&lt;li&gt;Uma página index.html&lt;/li&gt;
&lt;li&gt; Configurar o branch que será utilizado no github pages&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Quando iniciei minhas pesquisas para utilizar o github pages, criei o repositório &lt;a href=&quot;https://github.com/fabioaraujo/github-pages&quot; target=&quot;_blank&quot;&gt;https://github.com/fabioaraujo/github-pages, &lt;/a&gt;tendo essa informação, sei que o github publicará meu projeto no endereço &lt;a href=&quot;https://fabioaraujo.github.io/github-pages/&quot;&gt;https://fabioaraujo.github.io/github-pages/&lt;/a&gt;, &lt;span style=&quot;color: black;&quot;&gt;caso queira utilizar o endereço raiz do seu perfil, o nome do repositório deverá ser igual ao seu domínio, no meu caso seria f&lt;/span&gt;abioaraujo.github.io &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Inclua um arquivo index.html como abaixo e faça push para o seu repositório no github, caso prefira organizar o código css em seu próprio arquivo basta acessar o repositório mencionado acima.&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;script src=&quot;https://gist.github.com/fabioaraujo/38ff4bf5d88d854c8f5e7d70bbff3412.js&quot;&gt;&lt;/script&gt;
&lt;noscript&gt;

&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;GitHub Pages - Teste&lt;/title&gt;
    &lt;style&gt;
        @import url(&#39;https://fonts.googleapis.com/css?family=Prosto+One&#39;);

html,
body {
  height: 100%;
}

body {
  margin: 0;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
  background-color: #16a085;
  color: #fff;
}

h1 {
  font-family: &#39;Prosto One&#39;, cursive;
  font-size: 3rem;
}

p {
  font-size: 2rem;
  font-family: &#39;Arial&#39;, sans-serif;
   }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;
Testes com Github Pages&lt;/h1&gt;
&lt;p&gt;
Hello World!&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;

&lt;/noscript&gt;
&lt;/div&gt;
&lt;div&gt;
Entre em &quot;settings&quot; no seu repositório do GitHub e role a tela até encontrar a sessão do GitHub Pages ,&lt;/div&gt;
&lt;div&gt;
conforme imagem abaixo, selecione o branch utilizado para ser apresentado, por padrão será utilizado o branch gh-pages. Em meu teste precisei selecionar um Jekyll theme, mesmo não utilizando no portal para que o código fosse publicado e a mensagem &quot;Your site is published&quot; aparecesse em verde.&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpG-vf5wuwQUu9Gs0MSj3WGvofoo4Fybc9RS7_FShCURHl_avLFIJAPMP_CTSEfndf495tLnQz778QOIoEPzMmMS04By1YXB8o7VKkElgD1nEJ4qLJdaFasTnqj39jZDl-qhIs82uGCWPp/&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;GitHub Pages Settings&quot; border=&quot;0&quot; data-original-height=&quot;709&quot; data-original-width=&quot;891&quot; height=&quot;510&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpG-vf5wuwQUu9Gs0MSj3WGvofoo4Fybc9RS7_FShCURHl_avLFIJAPMP_CTSEfndf495tLnQz778QOIoEPzMmMS04By1YXB8o7VKkElgD1nEJ4qLJdaFasTnqj39jZDl-qhIs82uGCWPp/w640-h510/Capturar.PNG&quot; title=&quot;GitHub Pages Settings&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Após essas configurações basta acessar o endereço informado e seu portal estará online para visualização.&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpG-vf5wuwQUu9Gs0MSj3WGvofoo4Fybc9RS7_FShCURHl_avLFIJAPMP_CTSEfndf495tLnQz778QOIoEPzMmMS04By1YXB8o7VKkElgD1nEJ4qLJdaFasTnqj39jZDl-qhIs82uGCWPp/&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
Baseado no artigo &lt;a href=&quot;https://medium.com/trainingcenter/subindo-seu-projeto-front-github-pages-1b61e2e1c447&quot; rel=&quot;nofollow&quot;&gt;Subindo seu projeto Front-end gratuitamente com Github Pages&lt;/a&gt;&lt;br /&gt;
Mais informações em:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://help.github.com/en/github/working-with-github-pages&quot;&gt;Working with GitHub Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pages.github.com/&quot;&gt;Github Pages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><link>http://codereverse.blogspot.com/2020/05/como-utilizar-o-github-pages.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpG-vf5wuwQUu9Gs0MSj3WGvofoo4Fybc9RS7_FShCURHl_avLFIJAPMP_CTSEfndf495tLnQz778QOIoEPzMmMS04By1YXB8o7VKkElgD1nEJ4qLJdaFasTnqj39jZDl-qhIs82uGCWPp/s72-w640-h510-c/Capturar.PNG" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5957108997418726971.post-2367095599212186069</guid><pubDate>Thu, 25 May 2017 22:10:00 +0000</pubDate><atom:updated>2020-05-27T01:06:59.277-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">Spring</category><title>Como registrar servlets de terceiros com Spring Boot?</title><description>Em alguns projetos temos alguns servlets de terceiros configurados no web.xml como abaixo:

&lt;script src=&quot;https://gist.github.com/fabioaraujo/ad1aec38c23f179fc6289e90803f94f5.js&quot;&gt;&lt;/script&gt;
&lt;noscript&gt;
&lt;servlet&gt;
  &lt;servlet-name&gt;CustomServlet&lt;/servlet-name&gt;
  &lt;servlet-class&gt;br.com.blogspot.codereverse.CustomServlet&lt;/servlet-class&gt;
  &lt;init-param&gt;
   &lt;param-name&gt;parametroUm&lt;/param-name&gt;
   &lt;param-value&gt;valor1&lt;/param-value&gt;
  &lt;/init-param&gt;
  &lt;init-param&gt;
   &lt;param-name&gt;parametroDois&lt;/param-name&gt;
   &lt;param-value&gt;valor2&lt;/param-value&gt;
  &lt;/init-param&gt;
 &lt;/servlet&gt;

&lt;servlet-mapping&gt;
  &lt;servlet-name&gt;controller&lt;/servlet-name&gt;
  &lt;url-pattern&gt;/controller&lt;/url-pattern&gt;
 &lt;/servlet-mapping&gt;
&lt;/noscript&gt;

Para realizar essas configurações com Spring precisamos utilizar um código como abaixo:

&lt;script src=&quot;https://gist.github.com/fabioaraujo/e3b33875e55f6e5d30e1e3ff02114aac.js&quot;&gt;&lt;/script&gt;
&lt;noscript&gt;
@Configuration
public class ApplicationConfig{
...
@Bean
 public ServletRegistrationBean customServletRegistration() {
  ServletRegistrationBean registration = new ServletRegistrationBean(new CustomServlet());
  registration.addUrlMappings(&quot;/servlet&quot;);
  registration.setName(&quot;CustomServlet&quot;);

  Map&lt;String,String&gt; params = new HashMap&lt;String,String&gt;();
  params.put(&quot;parametroUm&quot;,&quot;valor1&quot;);
  params.put(&quot;parametroDois&quot;,&quot;valor2&quot;);
  registration.setInitParameters(params);
  
  return registration;
 }
...
}
&lt;/noscript&gt;</description><link>http://codereverse.blogspot.com/2017/05/como-registrar-servlets-de-terceiros.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5957108997418726971.post-7098287764719390694</guid><pubDate>Thu, 25 May 2017 21:57:00 +0000</pubDate><atom:updated>2020-05-27T01:14:41.522-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Spring</category><title>Como definir parâmetros de contexto com Spring Boot?</title><description>Nos arquivos web.xml podemos configurar parâmetros de contexto como abaixo:

&lt;script src=&quot;https://gist.github.com/fabioaraujo/9b97c4e78b99cf744244b3a6969c7897.js&quot;&gt;&lt;/script&gt;
&lt;noscript&gt;
...
&lt;context-param&gt;
  &lt;param-name&gt;nomeDoSeuParametro&lt;/param-name&gt;
  &lt;param-value&gt;valorDoParametro&lt;/param-value&gt;
&lt;/context-param&gt;
...
&lt;/noscript&gt;

Quando utilizamos Spring Boot precisamos adaptar nosso código, e encontramos um modo bem simples de efetuar essa mesma configuração, basta incluir uma linha no application.properties:

&lt;script src=&quot;https://gist.github.com/fabioaraujo/9c3c4988dd3bbe2d80c33af1e5f2db26.js&quot;&gt;&lt;/script&gt;
&lt;noscript&gt;
server.context_parameters.nomeDoSeuParametro=valorDoParametro
&lt;/noscript&gt;
</description><link>http://codereverse.blogspot.com/2017/05/como-parametros-de-contexto-com-spring.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5957108997418726971.post-9199465884131751278</guid><pubDate>Fri, 15 Jul 2016 18:00:00 +0000</pubDate><atom:updated>2016-07-15T15:00:08.518-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">database</category><category domain="http://www.blogger.com/atom/ns#">SQL</category><title>SQL - Structured Query Language - Parte 02</title><description>Continuando com este artigo sobre SQL, veremos neste post mais algumas funções que fazem do SQL uma ferramenta tão importante no desenvolvimento de aplicações que utilizam banco de dados. Começaremos então pela função DELETE.&lt;br /&gt;
&lt;blockquote&gt;
&lt;b&gt;DELETE&lt;/b&gt;&lt;br /&gt;
Apaga um ou mais registros de uma tabela. Se não for utilizado a cláusula WHERE, será apagada toda a tabela.&lt;br /&gt;
Exemplo:&lt;br /&gt;
DELETE FROM VENDAS WHERE DATA_VENDA &amp;lt;= &#39;2015-06-01&#39;;&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;b&gt;DROP TABLE&lt;/b&gt;&lt;br /&gt;
Apaga uma tabela do Banco de Dados, e também os indices referenciados e trigger&#39;s que a tabela faz referencia.&lt;br /&gt;
Exemplo:&lt;br /&gt;
DROP TABLE &quot;CLIENTES&quot;&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;b&gt;INSERT&lt;/b&gt;&lt;br /&gt;
Comando responsável para adicionar registros na tabela. Os campos que forem omitidos recebem valores nulos (null).&lt;br /&gt;
Exemplo:&lt;br /&gt;
INSERT INTO CLIENTES (ID,NOME) VALUES(1,&#39;Nome do Cliente&#39;);&lt;br /&gt;
INSERT INTO VENDAS_OLD SELECT * FROM VENDAS WHERE DATA_VENDA = getDate();&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;b&gt;MAX()&lt;/b&gt;&lt;br /&gt;
Função que agrega e retorna o valor máximo de uma coluna.&lt;br /&gt;
Exemplo:&lt;br /&gt;
SELECT MAX(PRECO) FROM PRODUTOS;&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;b&gt;MIN()&lt;/b&gt;&lt;br /&gt;
Função que agrega e retorna o valor mínimo de uma couna.&lt;br /&gt;
Exemplo: &lt;br /&gt;
SELECT MIN(PRECO) FROM PRODUTOS&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;b&gt;ROLLBACK&lt;/b&gt;&lt;br /&gt;
Desfaz as mudanças ocorridas até o exato momento no Banco de Dados, sem que o comando COMMIT tenha sido executado. Este comando e o Commit fecham a transação aberta pela aplicação e ou ferramenta de gerenciamento das tabelas.&lt;br /&gt;
Exemplo:&lt;br /&gt;
ROLLBACK&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;b&gt;Select&lt;/b&gt;&lt;br /&gt;
Este comando obtém os dados da tabela.&lt;br /&gt;
Exemplo:&lt;br /&gt;
Select * from FUNCIONARIOS &lt;br /&gt;
Select ID,Nome from CLIENTES where ID &amp;gt; 10&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;b&gt;SUM()&lt;/b&gt;&lt;br /&gt;
Função de agregação que retorna a soma os valores de uma coluna.&lt;br /&gt;
Exemplo:&lt;br /&gt;
Select SUM(VALOR) from VENDAS&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;b&gt;UPDATE&lt;/b&gt;&lt;br /&gt;
Comando responsável pela atualização da tabela. Se não for passado uma cláusula WHERE toda a coluna da tabela será atualizada.&lt;br /&gt;
Exemplo:&lt;br /&gt;
UPDATE CLIENTE SET ATIVO = 1&lt;br /&gt;
UPDATE CLIENTE SET ENDERECO = &#39;Rua 15&#39;, NUMERO = 14 WHERE ID = &#39;1&#39;&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;b&gt;UPPER()&lt;/b&gt;&lt;br /&gt;
Função que retorna uma string com todos os caracteres em maiúsculo.&lt;br /&gt;
Exemplo:&lt;br /&gt;
SELECT UPPER(NOME) FROM CLIENTES;&lt;br /&gt;
&lt;hr /&gt;
&lt;/blockquote&gt;
Estes são os principais comando SQL, ficou faltando uma maior atenção as várias cláusulas que o comando SELECT possui, e em breve estarei escrevendo sobre elas.</description><link>http://codereverse.blogspot.com/2016/07/sql-structured-query-language-parte-02.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5957108997418726971.post-8744534417029326701</guid><pubDate>Thu, 14 Jul 2016 17:47:00 +0000</pubDate><atom:updated>2016-07-14T14:53:57.495-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">database</category><category domain="http://www.blogger.com/atom/ns#">SQL</category><title>SQL - Structured Query Language - Parte 01</title><description>A SQL apresenta uma série de comandos para criação de tabelas e manipulação de seus registros. Conhecer SQL é essencial quando queremos acessar bancos de dados com velocidade e eficiencia. Para isto postarei algumas das mais usadas funções de SQL com exemplos de como usa-las corretamente.&lt;br /&gt;
&lt;blockquote&gt;
&lt;b&gt;ALTER TABLE&lt;/b&gt;&lt;br /&gt;
Altera a estrutura de uma tabela.&lt;br /&gt;
Exemplo:&lt;br /&gt;
ALTER TABLE CLIENTE ADD CPF CHAR(12)&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;b&gt;AVG()&lt;/b&gt;&lt;br /&gt;
Retorna a média de valores de uma coluna.&lt;br /&gt;
Exemplo:&lt;br /&gt;
SELECT MES, AVG(VALOR_DA_VENDA) FROM VENDAS ORDER BY MES&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;b&gt;CAST()&lt;/b&gt;&lt;br /&gt;
Converte uma coluana para outro tipo de dados.&lt;br /&gt;
Exemplo:&lt;br /&gt;
SELECT ITENS FROM PEDIDOS WHERE DATA &amp;gt;= CAST(:pDATA AS DATE)&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;b&gt;COMMIT&lt;/b&gt;&lt;br /&gt;
Grava as alterações de uma transação permanentemente no Banco de Dados.&lt;br /&gt;
Exemplo:&lt;br /&gt;
COMMIT&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;b&gt;COUNT()&lt;/b&gt;&lt;br /&gt;
Retorna a quantidade de registros para uma condição em um SELECT&lt;br /&gt;
Exemplo:&lt;br /&gt;
Select count(*) from pedidos&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;b&gt;CREATE TABLE&lt;/b&gt;&lt;br /&gt;
Cria uma nova tabela no seu banco de dados&lt;br /&gt;
Exemplo:&lt;br /&gt;
CREATE TABLE CLIENTES (&lt;br /&gt;
ID        INTEGER          NOT NULL&lt;br /&gt;
NOME      CHAR(60)         NOT NULL,&lt;br /&gt;
CPF       CHAR(12)         NOT NULL,&lt;br /&gt;
ENDERECO  CHAR(50),&lt;br /&gt;
CONSTRAINT PK_CLIENTE PRIMARY KEY(ID));&lt;br /&gt;
&lt;hr /&gt;
&lt;/blockquote&gt;
No próximo post mostrarei outras funções importantes de SQL, com as funções DELETE, INSERT e UPDATE, necessaria para a manipulação de uma tabela ou banco de dados.</description><link>http://codereverse.blogspot.com/2016/07/sql-structured-query-language-parte-01.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5957108997418726971.post-5590679186439850769</guid><pubDate>Wed, 13 Jul 2016 21:59:00 +0000</pubDate><atom:updated>2016-07-14T14:46:03.807-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">NPM</category><title>Listar pacotes NPM instalados globalmente e suas versões</title><description>Nos últimos dias procurando algumas soluções para alguns problemas no uso do NPM tive a curiosidade de saber quais pacotes tinha instalado e quais eram suas versões.&lt;br /&gt;
Após alguma pesquisa encontrei o código abaixo:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot; name=&quot;code&quot;&gt;npm list -g --depth=0
&lt;/pre&gt;
&lt;br /&gt;
O resultado será algo como abaixo:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot; name=&quot;code&quot;&gt;C:\Users\faraujo\AppData\Roaming\npm
├── bower@1.2.5
├── ember-cli@2.6.2
├── grunt-cli@0.1.9
├── jake@0.5.18
├── jshint@0.9.1
├── karma@0.8.7
├── minimatch@3.0.2
├── nodeunit@0.7.4
└── yo@1.0.4
&lt;/pre&gt;
</description><link>http://codereverse.blogspot.com/2016/07/listar-pacotes-npm-instalados.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5957108997418726971.post-4577425023330478918</guid><pubDate>Wed, 13 Jul 2016 21:56:00 +0000</pubDate><atom:updated>2020-05-27T01:16:03.224-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">BDD</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">TDD</category><title>Utilizando Cucumber para criar testes mais claros</title><description>Tenho utilizado o Cucumber atualmente para criar testes onde a intenção dos mesmos sejam mais claras, saber o motivo do teste e de seus passos até o retorno esperado sem precisar ficar lendo várias linhas de código. Com o Cucumber temos essa possibilidade pois os testes são escritos em nossa linguagem normal (por padrão inglês, mas com uma simples linha de configuração podemos escrever também em português).&lt;br /&gt;
Dependencias Maven:
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fabioaraujo/a270d10fc917afb07d25c1da4e48fd48.js&quot;&gt;&lt;/script&gt;
&lt;noscript&gt;
&lt;dependency&gt;
   &lt;groupid&gt;info.cukes&lt;/groupid&gt;
   &lt;artifactid&gt;cucumber-core&lt;/artifactid&gt;
   &lt;version&gt;1.1.5&lt;/version&gt;
   &lt;scope&gt;test&lt;/scope&gt;
  &lt;/dependency&gt;
  &lt;dependency&gt;
   &lt;groupid&gt;info.cukes&lt;/groupid&gt;
   &lt;artifactid&gt;cucumber-junit&lt;/artifactid&gt;
   &lt;version&gt;1.1.5&lt;/version&gt;
   &lt;scope&gt;test&lt;/scope&gt;
  &lt;/dependency&gt;
  &lt;dependency&gt;
   &lt;groupid&gt;junit&lt;/groupid&gt;
   &lt;artifactid&gt;junit&lt;/artifactid&gt;
   &lt;version&gt;4.11&lt;/version&gt;
   &lt;scope&gt;test&lt;/scope&gt;
  &lt;/dependency&gt;
&lt;!-- apenas se for utilizar injeção de dependências do spring --&gt;
  &lt;dependency&gt;
   &lt;groupid&gt;info.cukes&lt;/groupid&gt;
   &lt;artifactid&gt;cucumber-spring&lt;/artifactid&gt;
   &lt;version&gt;1.1.5&lt;/version&gt;
   &lt;scope&gt;test&lt;/scope&gt;
  &lt;/dependency&gt;
&lt;/noscript&gt;
&lt;br /&gt;
Teste escrito com Cucumber:
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fabioaraujo/318c8d14a644d602b370c2b653a10ac3.js&quot;&gt;&lt;/script&gt;
&lt;noscript&gt;
#language: pt 
Funcionalidade: Checar retorno dos métodos relacionados a modalidade

Cenario: Listar modalidades de um cliente que já resgatou ingresso
Dado usuario que já efetuou resgate
Quando quando solicitamos a lista de modalidades
Entao recebemos uma lista de modalidades vazia
E recebemos que já efetuou resgate
&lt;/noscript&gt;
Após a execução com o JUnit, o Cucumber nos informará que precisamos implementar os códigos que representam os passos do cenário acima descrito como abaixo:

&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fabioaraujo/ac2dd04c11c5b8404ee0c26f37350354.js&quot;&gt;&lt;/script&gt;
&lt;noscript&gt;
@Dado(&quot;^usuario que já efetuou resgate$&quot;)
 public void usuario_que_já_efetuou_resgate() throws Throwable {
  usuario_id(1);
 }
 
 @Dado(&quot;^possui (\\d+) pontos$&quot;)
 public void possui_pontos(int pontos) throws Throwable {
  Mockito.when(contaCorrenteFacade.consultaSaldo(Mockito.anyInt())).thenReturn(pontos);
 }

 @Quando(&quot;^quando solicitamos a lista de modalidades$&quot;)
 public void quando_solicitamos_a_lista_de_modalidades() throws Throwable {
     modalidades = modalidadeFacade.listarModalidades(usuario);
 }

 @Entao(&quot;^recebemos uma lista de modalidades vazia$&quot;)
 public void recebemos_uma_lista_de_modalidades_vazia() throws Throwable {
     Assert.assertTrue(&quot;A lista de modalidades não está vazia.&quot;, modalidades.isEmpty());
 }
&lt;/noscript&gt;
O resultado dos testes são apresentados da mesma maneira que o JUnit, mas agrupados por &quot;Funcionalidade&quot;.
Mais informações sobre o Cucumber em&amp;nbsp;&lt;a href=&quot;https://cucumber.io/&quot;&gt;https://cucumber.io/&lt;/a&gt;</description><link>http://codereverse.blogspot.com/2016/07/utilizando-cucumber-para-criar-testes.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5957108997418726971.post-6136496339928646863</guid><pubDate>Mon, 20 Feb 2012 01:18:00 +0000</pubDate><atom:updated>2020-05-27T01:17:01.993-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">DBUnit</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">TDD</category><title>TDD utilizando DBUnit</title><description>Executar testes unitários em métodos que acessam o banco de dados sempre geram dor de cabeça, porque precisamos garantir um estado esperado dos dados antes que o teste ocorra. testes que podem influenciar o banco de maneira que altere dados importantes para outros testes são outro problema.&lt;br /&gt;
Para evitar a necessidade de todo esse trabalho com SQL pra cá e pra lá para manter os dados no estado esperado, foi criado o framework &lt;a href=&quot;http://www.dbunit.org/&quot; target=&quot;_blank&quot;&gt;DBUnit&lt;/a&gt;.&lt;br /&gt;
DBUnit é uma extensão do JUnit destinado a trabalhar com banco de dados, seu maior objetivo é colocar seu banco de dados em um estado conhecido entre as execuções de teste, para que os problema acima não ocorram e possamos confiar nos resultados de nossos testes.&lt;br /&gt;
&lt;br /&gt;
O primeiro passo é &lt;a href=&quot;http://sourceforge.net/projects/dbunit/files/&quot; target=&quot;_blank&quot;&gt;baixar o arquivo jar do DBUnit&lt;/a&gt;, após coloca-lo no seu Build Path devemos criar um arquivo xml com os dados necessários para o seu teste, o modo mais simples que conheço é pedir para que o DBUnit leia uma ou mais tabelas e exporte-as para xml como no exemplo abaixo:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fabioaraujo/a3a5b5c6d6ebc7cdc23d8a55cbbcca0f.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;
Como podemos ver, existe a possibilidade de especificar um critério para os dados exportados utilizando clausulas SQL.&lt;br /&gt;
Com o arquivo XML gerado podemos partir para os testes:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fabioaraujo/d0aec6dd01a769b3b409019a5df4cca8.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;
&lt;noscript&gt;
private void exportaDadosParaTestObtemFuncionarioPorId() {
 try {
    Class driverClass = Class.forName(&quot;com.mysql.jdbc.Driver&quot;);
    Connection jdbcConnection = DriverManager.getConnection(
            &quot;jdbc:mysql://localhost/test&quot;, &quot;root&quot;, &quot;rute&quot;);
    IDatabaseConnection connection = new DatabaseConnection(jdbcConnection);

    QueryDataSet partialDataSet = new QueryDataSet(connection);
    partialDataSet.addTable(&quot;Funcionario&quot;, 
                                   &quot;SELECT * FROM Funcionario WHERE id=5&quot;);
    FlatXmlDataSet.write(partialDataSet, 
                    new FileOutputStream(&quot;testObtemFuncionarioPorId.xml&quot;));
 } catch (Exception e) {
    throw new RuntimeException(
        &quot;Erro ao exportar dados para o teste obtem funcionario por id&quot;, e);
 }   
}
&lt;/noscript&gt;
Na primeira linha do teste leio o nosso arquivo xml recém criado para que seja inserido seus dados no banco através do método insereDadosParaTeste, omiti o modo que obtenho a conexão com o banco porque essa parte varia muito da implementação que é utilizada no sistema, abaixo segue alguns exemplos que me deparei nos ultimos dias.&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fabioaraujo/84a5503c680808df282371ddb6a910e5.js&quot;&gt;&lt;/script&gt;
&lt;noscript&gt;
@Test
public void testObtemFuncionarioPorId() 
                          throws DataSetException, FileNotFoundException{
  IDataSet dataSet = new FlatXmlDataSetBuilder()
               .build(new FileInputStream(&quot;testObtemFuncionarioPorId.xml&quot;));
  insereDadosParaTeste(dataSet);
  Integer id = 5;
  Funcionario funcionario = facade.obtemFuncionarioPorId(id );
  Assert.assertNotNull(&quot;Não foi encontrado um funcionario com id = &quot; + 
                                                           id, funcionario);
}

private void insereDadosParaTeste(IDataSet dataSet) {
 try {
   Connection conn = ....
   DatabaseOperation.CLEAN_INSERT.execute(
                                    new DatabaseConnection(conn), dataSet);
 }catch(Exception e){
   throw new RuntimeException(e);
 }
}
&lt;/noscript&gt;
&lt;br /&gt;
A operação CLEAN_INSERT limpa as tabelas relacionadas e insere os dados gravados no XML.&lt;br /&gt;
Por fim podemos executar os testes necessários tendo certeza que o banco de dados está do jeito que esperamos quando criamos o teste.&lt;br /&gt;
&lt;br /&gt;
Ps: Lembre de tomar cuidado quando utilizar o getDelegate pois o retorno desse método depende de sua implementação, ou seja, o que funciona no tomcat, pode não funcionar no glassfish e o que funciona no hibernate pode não funcionar no eclipselink, maiores informações em &lt;a href=&quot;http://weblogs.java.net/blog/ss141213/archive/2009/05/be_careful_whil.html&quot; target=&quot;_blank&quot;&gt;Be careful while using EntityManager.getDelegate()&lt;/a&gt;</description><link>http://codereverse.blogspot.com/2012/02/tdd-utilizando-dbunit.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5957108997418726971.post-4295170447010014884</guid><pubDate>Thu, 16 Feb 2012 02:21:00 +0000</pubDate><atom:updated>2020-05-27T01:17:34.281-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">hibernate</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">performance</category><title>Hibernate - melhorando a performance com Stateless Session</title><description>Trabalhar utilizando a conhecida Session em processos com muitos objetos é sempre muito custoso em termos de memória e velocidade, e as chances de se deparar com exceções de OutOfMemory são grandes.&lt;br /&gt;
Nesses momentos o recomendado pelo manual de referencia do Hibernate é a utilização da StatelessSession, este objeto não permite LazyInitialization, persistência em cascata, first-level cache entre outras funcionalidades, ficando muito mais próximo do JDBC.&lt;br /&gt;
Abaixo segue um exemplo básico que implementa a StatelessSession. &lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/fabioaraujo/bd481bd47f5b02eda1390f4531193048.js&quot;&gt;&lt;/script&gt;
&lt;noscript&gt;
private SessionFactory sessionFactory;

public List&amp;lt;Contato&amp;gt; salvarTodosOsContatos(List&amp;lt;Contato&amp;gt; contatos){
  StatelessSession statelessSession = sessionFactory.openStatelessSession();
  Transaction tx = statelessSession.beginTransaction();
  for(Contato contato : contatos){
    if(contato.getId() == null){
      Integer id = (Integer) statelessSession.insert(contato);
      contato.setId(id);
    }else{
      statelessSession.update(contato);
    }

  }
  tx.commit();
  statelessSession.close();
  return contatos;
}
&lt;/noscript&gt;
&lt;br /&gt;
Nas pesquisas, tenho utilizado Stateless Session com Criteria ou HQL, dependendo da complexidade da pesquisa, nos momentos em que os dados retornados são apenas para visualização e após inserir e/ou recuperar algumas milhares de registros consegui perceber claramente as vantagens da StatelessSession.&lt;br /&gt;
Maiores informações sobre Stateless Session e batch processing no &lt;a href=&quot;http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html&quot; target=&quot;_blank&quot;&gt;guia de referencia do Hibernate&lt;/a&gt;.</description><link>http://codereverse.blogspot.com/2012/02/hibernate-melhorando-performance-com.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item></channel></rss>