// 
//     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+].

