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


. 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.



. 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.



. 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.



. 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();
}
----


. 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();
}
----


. 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`` .


. 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;
----


. 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");*
}
----


. 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");*
}
----


. 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`` .



. No editor, adicione o campo privado a seguir à classe de entidade.

[source,java]
----

private String name;
----


. 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.


. Selecione o campo  ``name``  na caixa de diálogo. Clique em Gerar.


. Adicione o seguinte método à classe.

[source,java]
----

public SimpleEntity(int id) {
    this.id = id;
    name = "Entity number " + id + " created at " + new Date();
}
----


. 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 {
----


. 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ê.



. 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;
----


. 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);
    }
}
----


. 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");
}
----


. 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.


. Clique em Procurar para abrir a caixa de diálogo Procurar Pastas do Repositório.


. Expanda o nó raiz e selecione *samples/javaee/WebAppJUnit*. Clique em OK.


. Especifique a Pasta Local para o códigos-fonte (a pasta local precisa estar vazia).


. 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.



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

