blob: 33500809c04874082abd68ae813b391454964174 [file] [log] [blame]
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
= Usando o Container EJB Incorporado para Testar Aplicações Corporativas
:jbake-type: tutorial
:jbake-tags: tutorials
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Usando o Container EJB Incorporado para Testar Aplicações Corporativas - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Usando o Container EJB Incorporado para Testar Aplicações Corporativas
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.
*Exercícios do Tutorial*
* <<Exercise_1,Testando um Bean de Sessão>>
* <<Exercise_1a,Criando o Projeto>>
* <<Exercise_1b,Criando o Bean de Sessão>>
* <<Exercise_1c,Testando o Bean de Sessão>>
* <<Exercise_1d,Modificando o Teste para Especificar Propriedades do Container>>
* <<Exercise_1e,Usando Anotações @BeforeClass e @AfterClass>>
* <<Exercise_2,Testando uma Classe de Entidade>>
* <<Exercise_2a,Criando a Classe de Entidade>>
* <<Exercise_2b,Modificando o Bean de Sessão>>
* <<Exercise_2c,Testando a Classe de Entidade>>
* <<Exercise_3,Fazendo Download do Projeto da Solução>>
*Para seguir este tutorial, são necessários os recursos e o software a seguir.*
|===
|Software ou Recurso |Versão Necessária
|link:/downloads/[+NetBeans IDE+] |Pacote Java EE 7.2, 7.3, 7.4, 8.0
|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+JDK (Java Development Kit)+] |versão 7 ou 8
|GlassFish Server Open Source Edition |3.1.x ou 4.x
|===
NOTE: 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.
*Pré-requisitos*
Este tutorial pressupõe que você tenha algum conhecimento básico das tecnologias a seguir, ou alguma experiência de programação com elas:
* Programação em Java
* NetBeans IDE
Antes de começar este tutorial, você pode se familiarizar com os seguintes documentos.
* link:javaee-gettingstarted.html[+Conceitos Básicos sobre Aplicações do Java EE+]
* link:../java/junit-intro.html[+Escrevendo Testes JUnit no NetBeans IDE+]
* link: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+]
Você pode fazer download link:https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FWebAppJUnit.zip[+de um arquivo compactado zip do projeto finalizado+].
== Testando um Bean de Sessão
Nesta sessão, você criará uma aplicação web Java EE simples que conterá uma classe de entidade e um bean de sessão.
=== Criando o Projeto
1. Selecione Arquivo > Novo Projeto (Ctrl-Shift-N; ⌘-Shift-N no Mac) no menu principal.
2. Na categoria Java Web, selecione Aplicação Web. Clique em Próximo.
3. Chame o projeto de *WebAppJUnit* e defina a localização do projeto.
4. Desmarque a opção Usar Pasta Dedicada, se ela estiver selecionada.
Clique em Próximo.
[start=5]
. Defina o servidor como *GlassFish Server* e defina a versão do Java EE para *Java EE 6 Web* ou *Java EE 7 Web*.
Clique em Finalizar.
=== Criando o Bean de Sessão
Neste exercício, você criará um bean de sessão muito simples que contém um método que adiciona dois números.
1. Clique com o botão direito do mouse no projeto WebAppJUnit na janela Projetos e selecione Novo > Outro.
2. Selecione o Bean de Sessão na categoria Enterprise JavaBeans. Clique em Próximo.
3. Digite *MyBean* como o Nome EJB.
4. Insira *bean* como o Nome do Pacote.
5. Selecione Sem Estado para o Tipo de Sessão. Clique em Finalizar.
Quando você clica em Finalizar, a nova classe é aberta no editor.
[start=6]
. No editor, adicione o seguinte método ``addNumbers`` à classe.
[source,java]
----
@Stateless
public class MyBean {
*public int addNumbers(int numberA, int numberB) {
return numberA + numberB;
}*
}
----
NOTE: Ele não é necessário para adicionar uma anotação ``@LocalBean`` ou implementar uma interface neste tutorial. Por default, o bean expõe uma view sem interface quando nenhuma view é especificada explicitamente.
[start=7]
. Salve as alterações.
=== Testando o Bean de Sessão
Neste exercício, você criará uma classe de teste para o bean de sessão que testará o método ``addNumbers`` . 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.
1. Clique com o botão direito do mouse na classe ``MyBean`` na janela Projetos e selecione Ferramentas > Criar Testes.
2. Selecione JUnit na lista drop-down Frameworks.
3. Use os valores default na caixa de diálogo Criar Testes. Clique em OK.
image::images/create-tests-dialog.png[title="Caixa de diálogo Criar Testes"]
NOTE: 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.
Quando você clica em OK, o IDE gera o arquivo ``MyBeanTest.java`` e abre a classe no editor.
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 ``javax.ejb.embeddable.EJBContainer.createEJBContainer()`` para criar uma instância do contêiner EJB. O método ``createEJBContainer()`` é um dos métodos na classe link:http://download.oracle.com/javaee/6/api/javax/ejb/embeddable/EJBContainer.html[+ ``EJBContainer`` +] que faz parte da API integrada do EJB 3.1.
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 ``glassfish-embedded-static-shell.jar`` .
image::images/embedded-static-shell-jar.png[title="Estrutura do projeto na janela Projetos"]
NOTE: O JAR ``glassfish-embedded-static-shell.jar`` não contém os códigos-fonte do contêiner EJB incorporado. O JAR ``glassfish-embedded-static-shell.jar`` 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.
[start=4]
. Modifique o método de teste esqueleto gerado para especificar valores para ``numberA`` , ``numberB`` e ``expResult`` e remova a chamada default para falha.
[source,java]
----
@Test
public void testAddNumbers() throws Exception {
System.out.println("addNumbers");
*int numberA = 1;
int numberB = 2;*
EJBContainer container = javax.ejb.embeddable.EJBContainer.createEJBContainer();
MyBean instance = (MyBean)container.getContext().lookup("java:global/classes/MyBean");
*int expResult = 3;*
int result = instance.addNumbers(numberA, numberB);
assertEquals(expResult, result);
container.close();
}
----
[start=5]
. Clique com o botão direito do mouse no projeto na janela Projetos e selecione Testar.
Quando você executa o teste, a janela Resultados do Teste é aberta no IDE e exibe o andamento e os resultados do teste.
image::images/test-results1.png[title="Janela Resultados do Teste"]
Você verá uma saída semelhante à seguinte na janela de Saída:
[source,java]
----
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)
----
=== Modificando o Teste para Especificar Propriedades do Container
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.
1. Adicione o seguinte código (em negrito) à classe de teste.
[source,java]
----
@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:
*Map<String, Object> properties = new HashMap<String, Object>();*
// Use the MODULES property to specify the set of modules to be initialized,
// in this case a java.io.File
*properties.put(EJBContainer.MODULES, new File("build/jar"));*
// Create the container instance, passing it the properties map:
EJBContainer container = javax.ejb.embeddable.EJBContainer.createEJBContainer(*properties*);
// 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();
}
----
[start=2]
. 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 ``java.util.HashMap`` e ``java.util.Map`` .
[start=3]
. Execute novamente o teste para confirmar se o teste modificado funciona e se o contêiner foi criado corretamente.
Você pode clicar no botão Reexecutar na janela Resultados do Teste.
=== Usando Anotações ``@BeforeClass`` e ``@AfterClass``
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.
Neste exercício, você moverá o código que cria o contêiner EJB para o método ``setUpClass`` . O método ``setUpClass`` é anotado com ``@BeforeClass`` 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 ``testAddNumbers`` e o contêiner existirá até que seja encerrado.
De forma semelhante, você moverá o código que encerra o contêiner para o método ``tearDownClass`` que é anotado com ``@AfterClass`` .
1. Adicione o campo a seguir à classe de teste.
[source,java]
----
private static EJBContainer container;
----
[start=2]
. Copie o código que cria o contêiner do método de teste ``testAddNumbers`` para o método ``setUpClass`` e
[source,java]
----
@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");*
}
----
[start=3]
. Copie o código que fecha o contêiner do método de teste ``testAddNumbers`` para o método ``tearDownClass`` .
[source,java]
----
@AfterClass
public static void tearDownClass() *throws Exception* {
*container.close();
System.out.println("Closing the container");*
}
----
[start=4]
. Remova o código redundante do método ``testAddNumbers`` . Salve as alterações.
A classe de teste deve se parecer com o seguinte.
[source,java]
----
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);
}
}
----
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.
image::images/test-results2a.png[title="Janela Resultados do Teste"]
Você pode ver que o método ``setUpClass`` foi executado antes do teste ``addNumbers`` e imprimiu "Abrindo o contêiner".
== Testando uma Classe de Entidade
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.
=== Criando a Classe de Entidade
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.
1. Clique com o botão direito do mouse no projeto WebAppJUnit na janela Projetos e selecione Novo > Outro.
2. Selecione a Classe de Entidade na categoria Persistência. Clique em Próximo.
3. Digite *SimpleEntity* como o Nome da Classe.
4. Selecione bean na lista drop-down Pacote.
5. Digite *int* como o Tipo de Chave Primária. Clique em Próximo.
6. Use o Nome e o Provedor da Unidade de Persistência Default.
7. Selecione ``jdbc/sample`` como a fonte de dados e Soltar e Criar como a estratégia. Clique em Finalizar.
image::images/create-entity-wizard.png[title="Caixa de diálogo Criar Classe de Entidade"]
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 ``persistence.xml`` que define as propriedades da unidade de persistência ``WebAppJUnitPU`` .
[start=8]
. No editor, adicione o campo privado a seguir à classe de entidade.
[source,java]
----
private String name;
----
[start=9]
. 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.
[start=10]
. Selecione o campo ``name`` na caixa de diálogo. Clique em Gerar.
[start=11]
. Adicione o seguinte método à classe.
[source,java]
----
public SimpleEntity(int id) {
this.id = id;
name = "Entity number " + id + " created at " + new Date();
}
----
[start=12]
. Use as anotações ``@NamedQueries`` e ``@NamedQuery`` para criar uma consulta SQL nomeada.
[source,java]
----
@Entity
*@NamedQueries({@NamedQuery(name = "SimpleEntity.findAll", query = "select e from SimpleEntity e")})*
public class SimpleEntity implements Serializable {
----
[start=13]
. Crie um construtor default.
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ê.
[start=14]
. Corrija suas importações para adicionar instruções de importação para ``javax.persistence.NamedQueries`` , ``javax.persistence.NamedQuery`` e ``java.util.Date`` . Salve as alterações.
Além do código default gerado, a classe de entidade agora deve ser semelhante a:
[source,java]
----
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();
}
...
}
----
=== Modificando o Bean de Sessão
Neste exercício, você editará o bean de sessão ``MyBean`` para adicionar métodos para inserir e recuperar dados para a tabela do banco de dados.
1. Abra ``MyBean.java`` no editor.
2. 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.
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.
[source,java]
----
@PersistenceContext(unitName="WebAppJUnitPU")
private EntityManager em;
----
[start=3]
. Adicione os seguintes métodos ``verify`` e ``insert`` .
[source,java]
----
@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);
}
}
----
[start=4]
. Corrija suas importações para importar o ``javax.persistence.Query`` e salve as alterações.
=== Testando a Classe de Entidade
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 ``insert`` e ``verify`` estão se comportando corretamente.
1. Inicie o banco de dados JavaDB.
2. Abra a classe de teste ``MyBeanTest.java`` no editor.
3. Edite a classe de teste para adicionar o seguinte método de teste ``testInsert`` .
[source,java]
----
@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");
}
----
[start=4]
. Na janela Projetos, clique com o botão direito do mouse no nó do projeto e escolha Testar no menu pop-up.
A janela Resultados do teste será aberta e exibirá uma saída semelhante à seguinte.
image::images/test-results2b.png[title="A janela Resultados do Teste depois da adição do teste testInsert"]
Você pode ver o andamento dos testes e a ordem na qual eles foram executados nas mensagens impressas que foram adicionadas à classe de teste.
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.
== Fazendo Download do Projeto da Solução
Você pode fazer o download da solução para este projeto como um projeto das seguintes formas.
* Faça download link:https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FWebAppJUnit.zip[+de um arquivo compactado zip do projeto finalizado+].
* Faça o check-out do código-fonte do projeto das Amostras do NetBeans ao executar as etapas a seguir:
1. Escolha Equipe > Subversion > Efetuar check-out no menu principal.
2. Na caixa de diálogo Check-out, insira o URL de Repositório a seguir:
``https://svn.netbeans.org/svn/samples~samples-source-code``
Clique em Próximo.
[start=3]
. Clique em Procurar para abrir a caixa de diálogo Procurar Pastas do Repositório.
[start=4]
. Expanda o nó raiz e selecione *samples/javaee/WebAppJUnit*. Clique em OK.
[start=5]
. Especifique a Pasta Local para o códigos-fonte (a pasta local precisa estar vazia).
[start=6]
. Clique em Finalizar.
Quando você clica em Finalizar, o IDE inicializa a pasta local como um repositório Subversion e verifica os códigos-fonte do projeto.
[start=7]
. Clique em Abrir Projeto na caixa de diálogo exibida quando o check-out for concluído.
NOTE: É necessário um cliente Subversion para verificar os códigos-fonte. Para saber mais sobre a instalação do Subversion, consulte a seção link:../ide/subversion.html#settingUp[+Configurando o Subversion+] no link:../ide/subversion.html[+Guia do Subversion no NetBeans IDE+].
link:/about/contact_form.html?to=3&subject=Feedback:%20Using%20the%20Embedded%20EJB%20Container[+Enviar Feedback neste Tutorial+]
== Consulte Também
Para obter mais informações sobre o uso do NetBeans IDE para desenvolver aplicações Java EE, consulte os seguintes recursos:
* link:javaee-intro.html[+Introdução à Tecnologia Java EE+]
* link:javaee-gettingstarted.html[+Conceitos Básicos sobre Aplicações do Java EE+]
* link:../web/quickstart-webapps.html[+Introdução ao Desenvolvimento de Aplicações Web+]
* link:../../trails/java-ee.html[+Trilha de Aprendizado do Java EE e Java Web+]
Você pode encontrar mais informações sobre o uso do Enterprise Beans EJB 3.1 no link:http://download.oracle.com/javaee/6/tutorial/doc/[+Tutorial do Java EE 6+].
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, link:../../../community/lists/top.html[+inscreva-se na lista de correspondência de nbj2ee+].