| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <!-- |
| Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. |
| --> |
| |
| <html> |
| <head> |
| <title>Usando o Container EJB Incorporado para Testar Aplicações Corporativas</title> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" > |
| <meta name="description" content="A tutorial on how to use the embedded EJB container to test a session bean and entity class."> |
| <meta name="KEYWORDS" content="NetBeans, embedded, EJB, container, GlassFish, JUnit, Tutorial"> |
| <link rel="stylesheet" href="../../../netbeans.css"> |
| <meta name="author" content="ken ganfield"> |
| </head> |
| <body> |
| <h1>Usando o Container EJB Incorporado para Testar Aplicações Corporativas</h1> |
| |
| <p>Esse tutorial demonstra como criar e executar testes JUnit para uma aplicação enterprise Java EE. Neste tutorial, você criará uma aplicação web com uma classe de entidade e um bean de sessão. Primeiro, você criará uma classe de teste JUnit para o bean de sessão e executará o teste no contêiner EJB incorporado. Em seguida, você adicionará uma classe de entidade ao projeto e modificará a classe de teste para adicionar um método de teste para a classe de entidade.</p> |
| |
| <p><b>Exercícios do Tutorial</b></p> |
| <img alt="O conteúdo desta página se aplica ao NetBeans IDE 7.2, 7.3, 7.4 e 8.0" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="O conteúdo desta página se aplica ao NetBeans IDE 7.2, 7.3, 7.4 e 8.0"> |
| <ul> |
| <li><a href="#Exercise_1">Testando um Bean de Sessão</a> |
| <ul> |
| <li><a href="#Exercise_1a">Criando o Projeto</a></li> |
| <li><a href="#Exercise_1b">Criando o Bean de Sessão</a></li> |
| <li><a href="#Exercise_1c">Testando o Bean de Sessão</a></li> |
| <li><a href="#Exercise_1d">Modificando o Teste para Especificar Propriedades do Container</a></li> |
| <li><a href="#Exercise_1e">Usando Anotações @BeforeClass e @AfterClass</a></li> |
| </ul> |
| </li> |
| <li><a href="#Exercise_2">Testando uma Classe de Entidade</a> |
| <ul> |
| <li><a href="#Exercise_2a">Criando a Classe de Entidade</a></li> |
| <li><a href="#Exercise_2b">Modificando o Bean de Sessão</a></li> |
| <li><a href="#Exercise_2c">Testando a Classe de Entidade</a></li> |
| </ul> |
| </li> |
| <li><a href="#Exercise_3">Fazendo Download do Projeto da Solução</a></li> |
| <!-- <li><a href="#Exercise_4">Troubleshooting</a></li>--> |
| </ul> |
| <p><b>Para seguir este tutorial, são necessários os recursos e o software a seguir.</b></p> |
| <table> |
| <tbody> |
| <tr> |
| <th class="tblheader" scope="col">Software ou Recurso</th> |
| <th class="tblheader" scope="col">Versão Necessária</th> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="/downloads/">NetBeans IDE</a></td> |
| <td class="tbltd1">Pacote Java EE 7.2, 7.3, 7.4, 8.0</td> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK (Java Development Kit)</a></td> |
| <td class="tbltd1">versão 7 ou 8</td> |
| </tr> |
| <tr> |
| <td class="tbltd1">GlassFish Server Open Source Edition</td> |
| <td class="tbltd1">3.1.x ou 4.x</td> |
| </tr> |
| </tbody> |
| </table> |
| <p class="notes"><strong>Observações.</strong></p> |
| <ul> |
| <li>Este tutorial requer o plug-in JUnit. Se você não tiver instalado o plug-in JUnit quando instalou o IDE, abra o Gerenciador de Plug-ins, selecione a guia plug-ins Disponíveis e instale o plug-in JUnit.</li> |
| |
| </ul> |
| <p><b>Pré-requisitos</b></p> |
| <p>Este tutorial pressupõe que você tenha algum conhecimento básico das tecnologias a seguir, ou alguma experiência de programação com elas:</p> |
| <ul> |
| <li>Programação em Java</li> |
| <li>NetBeans IDE</li> |
| </ul> |
| |
| <p>Antes de começar este tutorial, você pode se familiarizar com os seguintes documentos.</p> |
| <ul> |
| <li><a href="javaee-gettingstarted.html">Conceitos Básicos sobre Aplicações do Java EE</a></li> |
| <li><a href="../java/junit-intro.html">Escrevendo Testes JUnit no NetBeans IDE</a></li> |
| <li><a href="http://download.oracle.com/docs/cd/E19798-01/821-1754/gjlde/index.html">Usando a API integrada do EJB 3.1 com o GlassFish Server Incorporado</a></li> |
| </ul> |
| <p class="tips">Você pode fazer download <a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FWebAppJUnit.zip">de um arquivo compactado zip do projeto finalizado</a>.</p> |
| |
| <!-- ===================================================================================== --> |
| <a name="Exercise_1"></a> |
| <!--Exercise 1: --> |
| |
| <h2>Testando um Bean de Sessão</h2> |
| <p>Nesta sessão, você criará uma aplicação web Java EE simples que conterá uma classe de entidade e um bean de sessão.</p> |
| |
| <div class="indent"> |
| <a name="Exercise_1a"></a> |
| <h3>Criando o Projeto</h3> |
| |
| <ol> |
| <li>Selecione Arquivo > Novo Projeto (Ctrl-Shift-N; ⌘-Shift-N no Mac) no menu principal.</li> |
| <li>Na categoria Java Web, selecione Aplicação Web. Clique em Próximo. </li> |
| <li>Chame o projeto de <strong>WebAppJUnit</strong> e defina a localização do projeto.</li> |
| <li>Desmarque a opção Usar Pasta Dedicada, se ela estiver selecionada.<br> Clique em Próximo.</li> |
| <li>Defina o servidor como <strong>GlassFish Server</strong> e defina a versão do Java EE para <strong>Java EE 6 Web</strong> ou <strong>Java EE 7 Web</strong>. <br>Clique em Finalizar.</li> |
| </ol> |
| |
| |
| |
| |
| <a name="Exercise_1b"></a> |
| <h3>Criando o Bean de Sessão</h3> |
| <p>Neste exercício, você criará um bean de sessão muito simples que contém um método que adiciona dois números.</p> |
| <ol> |
| <li>Clique com o botão direito do mouse no projeto WebAppJUnit na janela Projetos e selecione Novo > Outro.</li> |
| <li>Selecione o Bean de Sessão na categoria Enterprise JavaBeans. Clique em Próximo.</li> |
| <li>Digite <strong>MyBean</strong> como o Nome EJB.</li> |
| <li>Insira <strong>bean</strong> como o Nome do Pacote.</li> |
| <li>Selecione Sem Estado para o Tipo de Sessão. Clique em Finalizar. |
| <p>Quando você clica em Finalizar, a nova classe é aberta no editor.</p></li> |
| <li>No editor, adicione o seguinte método <tt>addNumbers</tt> à classe. |
| <pre class="examplecode"> |
| @Stateless |
| public class MyBean { |
| <strong>public int addNumbers(int numberA, int numberB) { |
| return numberA + numberB; |
| }</strong> |
| }</pre> |
| <p class="notes"><strong>Observação.</strong> Ele não é necessário para adicionar uma anotação <tt>@LocalBean</tt> ou implementar uma interface neste tutorial. Por default, o bean expõe uma view sem interface quando nenhuma view é especificada explicitamente.</p> |
| </li> |
| <li>Salve as alterações.</li> |
| </ol> |
| |
| |
| |
| <a name="Exercise_1c"></a> |
| <h3>Testando o Bean de Sessão</h3> |
| <p>Neste exercício, você criará uma classe de teste para o bean de sessão que testará o método <tt>addNumbers</tt>. O IDE pode gerar os novos métodos de classe de teste e de teste esqueleto com base nos métodos da classe de destino.</p> |
| <ol> |
| <li>Clique com o botão direito do mouse na classe <tt>MyBean</tt> na janela Projetos e selecione Ferramentas > Criar Testes.</li> |
| <li>Selecione JUnit na lista drop-down Frameworks.</li> |
| <li>Use os valores default na caixa de diálogo Criar Testes. Clique em OK.<br> <img alt="Caixa de diálogo Criar Testes" class="margin-around b-all" src="../../../images_www/articles/72/javaee/junit-embedded-ant/create-tests-dialog.png" title="Caixa de diálogo Criar Testes"> |
| <p class="notes"><strong>Observação.</strong> Na primeira vez que você criar um teste da unidade JUnit, deverá especificar a versão de JUnit. Selecione a JUnit 4.x na caixa de diálogo Selecionar Versão do JUnit e clique em Selecionar.</p> |
| <p>Quando você clica em OK, o IDE gera o arquivo <tt>MyBeanTest.java</tt> e abre a classe no editor.</p> |
| |
| <p>Na janela Projetos, você pode ver que o IDE gerou a classe de teste no nó Testar Pacotes. Por default, o IDE gera um método de teste esqueleto na classe de teste que chama <tt>javax.ejb.embeddable.EJBContainer.createEJBContainer()</tt> para criar uma instância do contêiner EJB. O método <tt>createEJBContainer()</tt> é um dos métodos na classe <a href="http://download.oracle.com/javaee/6/api/javax/ejb/embeddable/EJBContainer.html"> <tt>EJBContainer</tt></a> que faz parte da API integrada do EJB 3.1.</p> |
| |
| <p>Se você expandir o nó Bibliotecas de Teste na janela Projetos, poderá ver que o IDE adicionou automaticamente o GlassFish Server (contêiner incorporado) e o JUnit 4.x como bibliotecas de teste. Se você expandir a biblioteca do GlassFish Server, verá que a biblioteca contém o <tt>glassfish-embedded-static-shell.jar</tt>. </p> |
| <img alt="tela da janela Projetos" class="margin-around b-all" src="../../../images_www/articles/72/javaee/junit-embedded-ant/embedded-static-shell-jar.png" title="Estrutura do projeto na janela Projetos"> |
| |
| |
| <p class="notes"><strong>Observação.</strong> O JAR <tt>glassfish-embedded-static-shell.jar</tt> não contém os códigos-fonte do contêiner EJB incorporado. O JAR <tt>glassfish-embedded-static-shell.jar</tt> requer uma instalação local do GlassFish. O classpath para a instalação local do GlassFish é determinado pelo servidor de destino do projeto. Você pode alterar o servidor de destino na caixa de diálogo Propriedades do projeto.</p> |
| </li> |
| <li>Modifique o método de teste esqueleto gerado para especificar valores para <tt>numberA</tt>, <tt>numberB</tt> e <tt>expResult</tt> e remova a chamada default para falha. |
| <pre class="examplecode">@Test |
| public void testAddNumbers() throws Exception { |
| System.out.println("addNumbers"); |
| <strong>int numberA = 1; |
| int numberB = 2;</strong> |
| EJBContainer container = javax.ejb.embeddable.EJBContainer.createEJBContainer(); |
| MyBean instance = (MyBean)container.getContext().lookup("java:global/classes/MyBean"); |
| <strong>int expResult = 3;</strong> |
| int result = instance.addNumbers(numberA, numberB); |
| assertEquals(expResult, result); |
| container.close(); |
| }</pre> |
| </li> |
| <li>Clique com o botão direito do mouse no projeto na janela Projetos e selecione Testar.</li> |
| </ol> |
| <p>Quando você executa o teste, a janela Resultados do Teste é aberta no IDE e exibe o andamento e os resultados do teste.</p> |
| <img alt="Janela Resultados do Teste" class="margin-around b-all" src="../../../images_www/articles/72/javaee/junit-embedded-ant/test-results1.png" title="Janela Resultados do Teste"> |
| <p>Você verá uma saída semelhante à seguinte na janela de Saída:</p> |
| <pre class="examplecode">Testsuite: bean.MyBeanTest |
| addNumbers |
| ... |
| Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 31.272 sec |
| |
| ------------- Standard Output --------------- |
| addNumbers |
| ... |
| ------------- ---------------- --------------- |
| test-report: |
| test: |
| BUILD SUCCESSFUL (total time: 35 seconds)</pre> |
| |
| |
| <a name="Exercise_1d"></a> |
| <h3>Modificando o Teste para Especificar Propriedades do Container</h3> |
| <p>Quando você usou o assistente Criar Testes, o IDE gerou uma classe de teste esqueleto default que continha código para iniciar o contêiner EJB. Neste exercício, você modificará o código gerado que inicia o contêiner para permitir a especificação de propriedades adicionais para a instância do contêiner incorporado.</p> |
| |
| <ol> |
| <li>Adicione o seguinte código (em negrito) à classe de teste. |
| |
| |
| <pre class="examplecode">@Test |
| public void testAddNumbers() throws Exception { |
| System.out.println("addNumbers"); |
| int numberA = 1; |
| int numberB = 2; |
| |
| // Create a properties map to pass to the embeddable container: |
| <strong>Map<String, Object> properties = new HashMap<String, Object>();</strong> |
| // Use the MODULES property to specify the set of modules to be initialized, |
| // in this case a java.io.File <!--representing an ejb-jar or exploded ejb-jar directory--> |
| <strong>properties.put(EJBContainer.MODULES, new File("build/jar"));</strong> |
| |
| // Create the container instance, passing it the properties map: |
| EJBContainer container = javax.ejb.embeddable.EJBContainer.createEJBContainer(<strong>properties</strong>); |
| |
| // Create the instance using the container context to look up the bean |
| // in the directory that contains the built classes |
| MyBean instance = (MyBean) container.getContext().lookup("java:global/classes/MyBean"); |
| |
| int expResult = 3; |
| |
| // Invoke the addNumbers method on the bean instance: |
| int result = instance.addNumbers(numberA, numberB); |
| |
| assertEquals(expResult, result); |
| |
| // Close the embeddable container: |
| container.close(); |
| }</pre></li> |
| <li>Clique com o botão direito do mouse no editor e selecione Corrigir Importações (Alt-Shift-I; ⌘-Shift-I no Mac) para adicionar instruções de importação para <tt>java.util.HashMap</tt> e <tt>java.util.Map</tt>.</li> |
| <li>Execute novamente o teste para confirmar se o teste modificado funciona e se o contêiner foi criado corretamente. |
| <p class="tips"> Você pode clicar no botão Reexecutar na janela Resultados do Teste.</p> |
| </li> |
| </ol> |
| <!-- TODO: need to check this |
| <p> If I do for example</p> |
| |
| <pre class="examplecode">properties.put(EJBContainer.MODULES, new File("build/some-folder-with-classes"));</pre> |
| |
| <p>then embeddable EJB container will use the folder |
| <tt>build/some-folder-with-classes</tt> to load EJBs from and the JNDI name to such |
| EJBs would be <tt>"java:global/some-folder-with-classes/<my ejb name>"</tt>. </p> |
| |
| <p>Or I could set it to the following.</p> |
| |
| <pre class="examplecode">properties.put(EJBContainer.MODULES, new File("build/my-archive.jar"));</pre> |
| |
| <p>and lookup would be <tt>"java:global/my-archive/<my ejb name>"</tt> and only EJBs from |
| my-archive.jar would be loaded.</p> |
| |
| <p>Just for the sake of example, if I wanted to use a single JNDI name regardless |
| of my EJB being in archive or a classes folder then I would have to create |
| ejb-jar.xml and set the module name to "my-module-name" and in unit test I could do</p> |
| |
| <pre class="examplecode">properties.put(EJBContainer.MODULES, new File("build/some-folder-with-classes"));</pre> |
| <p>or</p> |
| <pre class="examplecode">properties.put(EJBContainer.MODULES, new File("build/my-archive.jar"));</pre> |
| |
| <p>The JNDI name would be the same in both of the cases:<br> |
| <tt>"java:global/my-module-name/<my ejb name>"</tt></p> |
| |
| <p>In the last example you could put this dir/jar in the classpath, skip the |
| property, and get the same result. |
| </p> |
| --> |
| |
| <a name="Exercise_1e"></a> |
| <h3>Usando Anotações <tt>@BeforeClass</tt> e <tt>@AfterClass</tt></h3> |
| |
| <p>Neste exercício, você modificará a classe de teste para criar métodos individuais para criar e encerrar a instância do contêiner. Isso pode ser útil quando você desejar executar vários testes que podem usar a mesma instância do contêiner. Dessa forma, não é necessário abrir e fechar uma instância do contêiner para cada teste e criar, em vez disso, uma instância que é criada de os testes serem executados e fechada depois de todos os testes terem sido concluídos.</p> |
| |
| <p>Neste exercício, você moverá o código que cria o contêiner EJB para o método <tt>setUpClass</tt>. O método <tt>setUpClass</tt> é anotado com <tt>@BeforeClass</tt> que é usado para indicar um método que será executado primeiro, antes dos outros métodos na classe de teste. Neste exemplo, a instância do contêiner será criada antes do método de teste <tt>testAddNumbers</tt> e o contêiner existirá até que seja encerrado.</p> |
| |
| <p>De forma semelhante, você moverá o código que encerra o contêiner para o método <tt>tearDownClass</tt> que é anotado com <tt>@AfterClass</tt>.</p> |
| |
| <ol> |
| <li>Adicione o campo a seguir à classe de teste. |
| <pre class="examplecode">private static EJBContainer container;</pre></li> |
| <li>Copie o código que cria o contêiner do método de teste <tt>testAddNumbers</tt> para o método <tt>setUpClass</tt> e |
| <pre class=examplecode>@BeforeClass |
| public static void setUpClass() <strong>throws Exception</strong> { |
| <strong>Map<String, Object> properties = new HashMap<String, Object>(); |
| properties.put(EJBContainer.MODULES, new File("build/jar")); |
| container = EJBContainer.createEJBContainer(properties); |
| System.out.println("Opening the container");</strong> |
| }</pre> |
| </li> |
| <li>Copie o código que fecha o contêiner do método de teste <tt>testAddNumbers</tt> para o método <tt>tearDownClass</tt>. |
| <pre class=examplecode>@AfterClass |
| public static void tearDownClass() <strong>throws Exception</strong> { |
| <strong>container.close(); |
| System.out.println("Closing the container");</strong> |
| }</pre> |
| </li> |
| <li>Remova o código redundante do método <tt>testAddNumbers</tt>. Salve as alterações.</li> |
| </ol> |
| |
| <p>A classe de teste deve se parecer com o seguinte.</p> |
| <pre class=examplecode>public class MyBeanTest { |
| private static EJBContainer container; |
| |
| public MyBeanTest() { |
| } |
| |
| @BeforeClass |
| public static void setUpClass() throws Exception { |
| Map<String, Object> properties = new HashMap<String, Object>(); |
| properties.put(EJBContainer.MODULES, new File("build/jar")); |
| container = EJBContainer.createEJBContainer(properties); |
| System.out.println("Opening the container"); |
| } |
| |
| @AfterClass |
| public static void tearDownClass() throws Exception { |
| container.close(); |
| System.out.println("Closing the container"); |
| } |
| |
| @Before |
| public void setUp() { |
| } |
| |
| @After |
| public void tearDown() { |
| } |
| |
| /** |
| * Test of addNumbers method, of class MyBean. |
| */ |
| @Test |
| public void testAddNumbers() throws Exception { |
| System.out.println("addNumbers"); |
| int numberA = 1; |
| int numberB = 2; |
| |
| // Create the instance using the container context to look up the bean |
| // in the directory that contains the built classes |
| MyBean instance = (MyBean) container.getContext().lookup("java:global/classes/MyBean"); |
| |
| int expResult = 3; |
| |
| // Invoke the addNumbers method on the bean instance: |
| int result = instance.addNumbers(numberA, numberB); |
| |
| assertEquals(expResult, result); |
| } |
| }</pre> |
| |
| <p>Caso você execute novamente o teste para confirmar se o contêiner é criado e fechado corretamente, verá uma saída semelhante à seguinte na janela Resultados do Teste.</p> |
| <img alt="Janela Resultados do Teste" class="margin-around b-all" src="../../../images_www/articles/72/javaee/junit-embedded-ant/test-results2a.png" title="Janela Resultados do Teste"> |
| <p>Você pode ver que o método <tt>setUpClass</tt> foi executado antes do teste <tt>addNumbers</tt> e imprimiu "Abrindo o contêiner".</p> |
| </div> |
| |
| |
| |
| <!-- ===================================================================================== --> |
| <a name="Exercise_2"></a> |
| <h2>Testando uma Classe de Entidade</h2> |
| <p>Nesta sessão, você criará uma classe de entidade e unidade de persistência, e modificará o bean de sessão para injetar o gerenciador de entidades e acessar as entidades. Você adicionará um método simples à nova classe de entidade que imprime o número de id da entrada na saída. Em seguida, você adicionará alguns métodos simples ao bean de sessão para criar e verificar entradas no banco de dados. |
| </p> |
| |
| <div class="indent"> |
| <a name="Exercise_2a"></a> |
| <h3>Criando a Classe de Entidade</h3> |
| <p>Nesta seção, você usará o assistente Nova Classe de Entidade para criar uma classe de entidade e uma unidade de persistência com os detalhes de conexão do banco de dados. |
| <ol> |
| <li>Clique com o botão direito do mouse no projeto WebAppJUnit na janela Projetos e selecione Novo > Outro.</li> |
| <li>Selecione a Classe de Entidade na categoria Persistência. Clique em Próximo.</li> |
| <li>Digite <strong>SimpleEntity</strong> como o Nome da Classe.</li> |
| <li>Selecione bean na lista drop-down Pacote.</li> |
| <li>Digite <strong>int</strong> como o Tipo de Chave Primária. Clique em Próximo.</li> |
| <li>Use o Nome e o Provedor da Unidade de Persistência Default.</li> |
| <li>Selecione <tt>jdbc/sample</tt> como a fonte de dados e Soltar e Criar como a estratégia. Clique em Finalizar.<br> <img alt="Caixa de diálogo Criar Classe de Entidade" class="margin-around b-all" src="../../../images_www/articles/72/javaee/junit-embedded-ant/create-entity-wizard.png" title="Caixa de diálogo Criar Classe de Entidade"> |
| <p>Quando você clica em Finalizar, a nova classe de entidade é aberta no editor. Se você expandir o nó Arquivos de Configuração na janela Projetos, verá que o IDE gerou automaticamente o arquivo <tt>persistence.xml</tt> que define as propriedades da unidade de persistência <tt>WebAppJUnitPU</tt>.</p></li> |
| <li>No editor, adicione o campo privado a seguir à classe de entidade. |
| <pre class="examplecode">private String name;</pre> |
| </li> |
| <li>Clique com o botão direito do mouse no Editor de Código-Fonte e selecione Inserir Código (Alt-Insert; Ctrl-I no Mac) e selecione Getter e Setter para abrir a caixa de diálogo Gerar Getters e Setters.</li> |
| <li>Selecione o campo <tt>name</tt> na caixa de diálogo. Clique em Gerar.<br /> |
| <li>Adicione o seguinte método à classe. |
| <pre class="examplecode"> |
| public SimpleEntity(int id) { |
| this.id = id; |
| name = "Entity number " + id + " created at " + new Date(); |
| }</pre> |
| </li> |
| <li>Use as anotações <tt>@NamedQueries</tt> e <tt>@NamedQuery</tt> para criar uma consulta SQL nomeada. |
| <pre class="examplecode">@Entity |
| <strong>@NamedQueries({@NamedQuery(name = "SimpleEntity.findAll", query = "select e from SimpleEntity e")})</strong> |
| public class SimpleEntity implements Serializable {</pre> |
| </li> |
| <li>Crie um construtor default. |
| <p class="tips">Você pode clicar no ícone de sugestão exibido na medianiz, próximo à declaração de classe, se quiser que o IDE gere o construtor para você.</p> |
| </li> |
| <li>Corrija suas importações para adicionar instruções de importação para <tt>javax.persistence.NamedQueries</tt>, <tt>javax.persistence.NamedQuery</tt> e <tt>java.util.Date</tt>. Salve as alterações.</li> |
| </ol> |
| |
| <p>Além do código default gerado, a classe de entidade agora deve ser semelhante a:</p> |
| |
| <pre class="examplecode">package bean; |
| |
| import java.io.Serializable; |
| import java.util.Date; |
| import javax.persistence.Entity; |
| import javax.persistence.GeneratedValue; |
| import javax.persistence.GenerationType; |
| import javax.persistence.Id; |
| import javax.persistence.NamedQueries; |
| import javax.persistence.NamedQuery; |
| |
| |
| @Entity |
| @NamedQueries({@NamedQuery(name = "SimpleEntity.findAll", query = "select e from SimpleEntity e")}) |
| public class SimpleEntity implements Serializable { |
| private static final long serialVersionUID = 1L; |
| @Id |
| @GeneratedValue(strategy = GenerationType.AUTO) |
| private int id; |
| |
| private String name; |
| |
| public SimpleEntity() { |
| } |
| |
| public String getName() { |
| return name; |
| } |
| |
| public void setName(String name) { |
| this.name = name; |
| } |
| |
| public SimpleEntity(int id) { |
| this.id = id; |
| name = "Entity number " + id + " created at " + new Date(); |
| } |
| |
| |
| |
| ... |
| |
| }</pre> |
| |
| |
| <a name="Exercise_2b"></a> |
| <h3>Modificando o Bean de Sessão</h3> |
| <p>Neste exercício, você editará o bean de sessão <tt>MyBean</tt> para adicionar métodos para inserir e recuperar dados para a tabela do banco de dados.</p> |
| <ol> |
| <li>Abra <tt>MyBean.java</tt> no editor.</li> |
| <li>Clique com o botão direito do mouse no editor, selecione Inserir Código (Alt-Insert; Ctrl-I no Mac) e selecione Usar Gerenciador de Entidades no menu pop-up. |
| <p>Quando você tiver selecionado Usar Gerenciador de Entidades, o IDE terá adicionado o código a seguir à classe para injetar o gerenciador de entidades. Você pode ver que o nome da unidade de persistência foi gerado automaticamente.</p> |
| <pre class="examplecode">@PersistenceContext(unitName="WebAppJUnitPU") |
| private EntityManager em;</pre> |
| </li> |
| <li>Adicione os seguintes métodos <tt>verify</tt> e <tt>insert</tt>. |
| <pre class="examplecode">@PermitAll |
| public int verify() { |
| String result = null; |
| Query q = em.createNamedQuery("SimpleEntity.findAll"); |
| Collection entities = q.getResultList(); |
| int s = entities.size(); |
| for (Object o : entities) { |
| SimpleEntity se = (SimpleEntity)o; |
| System.out.println("Found: " + se.getName()); |
| } |
| |
| return s; |
| } |
| |
| @PermitAll |
| public void insert(int num) { |
| for (int i = 1; i <= num; i++) { |
| System.out.println("Inserting # " + i); |
| SimpleEntity e = new SimpleEntity(i); |
| em.persist(e); |
| } |
| }</pre></li> |
| <li>Corrija suas importações para importar o <tt>javax.persistence.Query</tt> e salve as alterações.</li> |
| </ol> |
| |
| |
| |
| <a name="Exercise_2c"></a> |
| <h3>Testando a Classe de Entidade</h3> |
| <p>Neste exercício, você editará a classe de teste para adicionar um método para testar se a aplicação pode procurar o EJB e se os métodos <tt>insert</tt> e <tt>verify</tt> estão se comportando corretamente.</p> |
| <ol> |
| <li>Inicie o banco de dados JavaDB.</li> |
| <li>Abra a classe de teste <tt>MyBeanTest.java</tt> no editor.</li> |
| <li>Edite a classe de teste para adicionar o seguinte método de teste <tt>testInsert</tt>. |
| <pre class="examplecode">@Test |
| public void testInsert() throws Exception { |
| |
| // Lookup the EJB |
| System.out.println("Looking up EJB..."); |
| MyBean instance = (MyBean) container.getContext().lookup("java:global/classes/MyBean"); |
| |
| System.out.println("Inserting entities..."); |
| instance.insert(5); |
| int res = instance.verify(); |
| System.out.println("JPA call returned: " + res); |
| System.out.println("Done calling EJB"); |
| |
| Assert.assertTrue("Unexpected number of entities", (res == 5)); |
| System.out.println("..........SUCCESSFULLY finished embedded test"); |
| }</pre> |
| </li> |
| <!-- <li>Fix your imports to import <tt>javax.naming.Context</tt> and <tt>junit.framework.Assert</tt>.</li>--> |
| <li>Na janela Projetos, clique com o botão direito do mouse no nó do projeto e escolha Testar no menu pop-up.</li> |
| </ol> |
| |
| <p>A janela Resultados do teste será aberta e exibirá uma saída semelhante à seguinte.</p> |
| |
| <img alt="Janela Resultados do Teste" class="margin-around b-all" src="../../../images_www/articles/72/javaee/junit-embedded-ant/test-results2b.png" title="A janela Resultados do Teste depois da adição do teste testInsert"> |
| |
| <p>Você pode ver o andamento dos testes e a ordem na qual eles foram executados nas mensagens impressas que foram adicionadas à classe de teste. |
| </p> |
| |
| </div> |
| |
| Agora que você tem um teste para seu bean de sessão e sabe que a conexão de sua classe de entidade funciona, pode começar a codificar uma interface web para a aplicação. |
| |
| |
| <!-- ===================================================================================== --> |
| <a name="Exercise_3"></a> |
| |
| <h2>Fazendo Download do Projeto da Solução</h2> |
| <p>Você pode fazer o download da solução para este projeto como um projeto das seguintes formas.</p> |
| <ul> |
| <li>Faça download <a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FWebAppJUnit.zip">de um arquivo compactado zip do projeto finalizado</a>.</li> |
| <li>Faça o check-out do código-fonte do projeto das Amostras do NetBeans ao executar as etapas a seguir: |
| <ol> |
| <li>Escolha Equipe > Subversion > Efetuar check-out no menu principal.</li> |
| <li>Na caixa de diálogo Check-out, insira o URL de Repositório a seguir:<br> <tt>https://svn.netbeans.org/svn/samples~samples-source-code</tt><br> Clique em Próximo.</li> |
| <li>Clique em Procurar para abrir a caixa de diálogo Procurar Pastas do Repositório.</li> |
| <li>Expanda o nó raiz e selecione <strong>samples/javaee/WebAppJUnit</strong>. Clique em OK.</li> |
| <li>Especifique a Pasta Local para o códigos-fonte (a pasta local precisa estar vazia).</li> |
| <li>Clique em Finalizar. |
| <p>Quando você clica em Finalizar, o IDE inicializa a pasta local como um repositório Subversion e verifica os códigos-fonte do projeto.</p> |
| </li> |
| <li>Clique em Abrir Projeto na caixa de diálogo exibida quando o check-out for concluído.</li> |
| </ol> |
| <p class="notes"><strong>Observações.</strong></p> |
| <ul> |
| <li>É necessário um cliente Subversion para verificar os códigos-fonte. Para saber mais sobre a instalação do Subversion, consulte a seção <a href="../ide/subversion.html#settingUp">Configurando o Subversion</a> no <a href="../ide/subversion.html">Guia do Subversion no NetBeans IDE</a>.</li> |
| </ul> |
| </li> |
| </ul> |
| |
| |
| |
| |
| <!--<a name="Exercise_4"></a> |
| |
| <h2>Troubleshooting</h2> |
| <p></p>--> |
| |
| <!--<p>If you are using this tutorial on OS X, you may encounter the following problem when testing the project.</p> |
| <div class="indent"> |
| <h3>OutOfMemory Exception</h3> |
| |
| <p>To prevent an OutOfMemory (OOM) exception, you need to modify the build script.</p> |
| <ol> |
| <li>Expand the project in the Files window.</li> |
| <li>Expand the nbproject node and double-click <tt>build-impl.xml</tt> to open the file in the editor.</li> |
| <li>Search for macrodef-junit in the file.</li> |
| <li>Locate the classpath elements. |
| <pre class="examplecode"> |
| <macrodef name="junit" uri="https://netbeans.org/ns/web-project/2"> |
| ... |
| <sequential> |
| ... |
| <strong><classpath> |
| <path path="${run.test.classpath}"/> |
| <path path="${j2ee.platform.classpath}"/> |
| <path path="${j2ee.platform.embeddableejb.classpath}"/> |
| </classpath></strong> |
| ... |
| <sequential> |
| ... |
| <macrodef name="junit" uri="https://netbeans.org/ns/web-project/2"> |
| </pre></li> |
| <li>Comment out the following classpath element. |
| <pre class="examplecode"><path path="${j2ee.platform.classpath}"/></pre> |
| </li> |
| <li>Save your changes.</li> |
| |
| </ol>--> |
| |
| |
| |
| |
| <br> |
| <div class="feedback-box" ><a href="/about/contact_form.html?to=3&subject=Feedback:%20Using%20the%20Embedded%20EJB%20Container">Enviar Feedback neste Tutorial</a></div> |
| <br style="clear:both;"> |
| <!-- ======================================================================================= --> |
| <h2><a name="nextsteps"></a>Consulte Também</h2> |
| <p>Para obter mais informações sobre o uso do NetBeans IDE para desenvolver aplicações Java EE, consulte os seguintes recursos: |
| </p> |
| <ul> |
| <li><a href="javaee-intro.html">Introdução à Tecnologia Java EE</a></li> |
| <li><a href="javaee-gettingstarted.html">Conceitos Básicos sobre Aplicações do Java EE</a></li> |
| <li><a href="../web/quickstart-webapps.html">Introdução ao Desenvolvimento de Aplicações Web</a></li> |
| <li><a href="../../trails/java-ee.html">Trilha de Aprendizado do Java EE e Java Web</a></li> |
| </ul> |
| <p>Você pode encontrar mais informações sobre o uso do Enterprise Beans EJB 3.1 no <a href="http://download.oracle.com/javaee/6/tutorial/doc/">Tutorial do Java EE 6</a>.</p> |
| <p>Para enviar comentários e sugestões, obter suporte e se manter informado sobre os mais recentes desenvolvimentos das funcionalidades de desenvolvimento do Java EE do NetBeans IDE, <a href="../../../community/lists/top.html">inscreva-se na lista de correspondência de nbj2ee</a>.</p> |
| </body> |
| </html> |