blob: e5e1ff5fc9dd08bf0444dc73c1719ae69a8e24aa [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Apache TomEE</title>
<meta name="description"
content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." />
<meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" />
<meta name="author" content="Luka Cvetinovic for Codrops" />
<link rel="icon" href="../../../favicon.ico">
<link rel="icon" type="image/png" href="../../../favicon.png">
<meta name="msapplication-TileColor" content="#80287a">
<meta name="theme-color" content="#80287a">
<link rel="stylesheet" type="text/css" href="../../../css/normalize.css">
<link rel="stylesheet" type="text/css" href="../../../css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../../../css/owl.css">
<link rel="stylesheet" type="text/css" href="../../../css/animate.css">
<link rel="stylesheet" type="text/css" href="../../../fonts/font-awesome-4.1.0/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="../../../fonts/eleganticons/et-icons.css">
<link rel="stylesheet" type="text/css" href="../../../css/jqtree.css">
<link rel="stylesheet" type="text/css" href="../../../css/idea.css">
<link rel="stylesheet" type="text/css" href="../../../css/cardio.css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-2717626-1']);
_gaq.push(['_setDomainName', 'apache.org']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
<div class="preloader">
<img src="../../../img/loader.gif" alt="Preloader image">
</div>
<nav class="navbar">
<div class="container">
<div class="row"> <div class="col-md-12">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">
<span>
<img src="../../../img/logo-active.png">
</span>
Apache TomEE
</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right main-nav">
<li><a href="../../../docs.html">Documentation</a></li>
<li><a href="../../../community/index.html">Community</a></li>
<li><a href="../../../security/security.html">Security</a></li>
<li><a href="../../../download-ng.html">Downloads</a></li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div></div>
</div>
<!-- /.container-fluid -->
</nav>
<div id="main-block" class="container main-block">
<div class="row title">
<div class="col-md-12">
<div class='page-header'>
<h1>Exemplo do Application Composer e Mockito</h1>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Neste exemplo, um serviço REST vai ser testado, usando Aplication Composer e Mockito.</p>
</div>
<div class="paragraph">
<p><a href="http://tomee.apache.org/tomee-8.0/docs/application-composer/index.html">Application Composer</a> é uma API de teste para o TomEE. É mais rápido inicializar do que o Arquillian. <a href="https://site.mockito.org/">Mockito</a> é uma estrutura de simulação. Ambos serão usados para testar um serviço REST.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_exemplo">Exemplo</h2>
<div class="sectionbody">
<div class="paragraph">
<p>O exemplo de serviço REST é definido pela seguinte classe:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">@Singleton
@Path("/greeting")
public class GreetingService {
@Inject
private Messager messager;
@GET
public String message() {
return messager.message();
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Um bean, <code>messenger</code>, é injetado. Quando um cliente acessa o recurso <code>GET/greeting</code>, o conteúdo retornado ao cliente será o resultado da execução do método <code>messenger.message()</code>.</p>
</div>
<div class="paragraph">
<p>A funcionalidade <code>Messager</code> é definida por esta interface:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">public interface Messager {
String message();
}</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_testando_o_serviço_rest">Testando o serviço REST</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Para testar este serviço REST, o Application Composer será usado em combinação com o Mockito:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">@RunWith(ApplicationComposer.class)
public class GreetingServiceTest {
@Mock
private Messager messager;
@Configuration
public Properties configuration() {
return new Properties() {{
setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, Boolean.TRUE.toString());
}};
}
@MockInjector
public Class&lt;?&gt; mockitoInjector() {
return MockitoInjector.class;
}
@Module
public Class&lt;?&gt;[] app() {
return new Class&lt;?&gt;[]{GreetingService.class, Messager.class};
}
@Test
public void checkMockIsUsed() throws IOException {
when(messager.message()).thenReturn("mockito");
final String message = IO.slurp(new URL("http://localhost:4204/GreetingServiceTest/greeting/"));
assertEquals("mockito", message);
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Podemos ver o uso e a configuração do ApplicationComposer. Mais informações podem ser encontradas em <a href="http://tomee.apache.org/tomee-8.0/docs/application-composer/index.html">aqui</a>.</p>
</div>
<div class="paragraph">
<p>Outra anotação interessante é <code>@MockInjector</code>. Isso informa ao contêiner iniciado pelo application composer que o Mockito é usado, para que as propriedades simuladas sejam injetadas.</p>
</div>
<div class="paragraph">
<p>O método de teste substitui o método <code>messenger.message()</code>, retornando o valor "mockito". Em seguida, verifica se, acessando <code>GET greeting</code>, o conteúdo recuperado é "mockito ".</p>
</div>
<div class="paragraph">
<p>Exemplo de código completo pode ser encontrado em <a href="https://github.com/apache/tomee/tree/master/examples/rest-applicationcomposer-mockito">aqui</a>. É um projeto maven, e os testes podem ser executados pelo comando <code>mvn clean install</code>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_apis_used">APIs Used</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p><a href="../../../latest/javadoc/org/apache/openejb/OpenEjbContainer.html">org.apache.openejb.OpenEjbContainer</a></p>
</li>
<li>
<p><a href="../../../latest/javadoc/org/apache/openejb/junit/ApplicationComposer.html">org.apache.openejb.junit.ApplicationComposer</a></p>
</li>
<li>
<p><a href="../../../latest/javadoc/org/apache/openejb/loader/IO.html">org.apache.openejb.loader.IO</a></p>
</li>
<li>
<p><a href="../../../latest/javadoc/org/apache/openejb/mockito/MockitoInjector.html">org.apache.openejb.mockito.MockitoInjector</a></p>
</li>
<li>
<p><a href="../../../latest/javadoc/org/apache/openejb/testing/Configuration.html">org.apache.openejb.testing.Configuration</a></p>
</li>
<li>
<p><a href="../../../latest/javadoc/org/apache/openejb/testing/MockInjector.html">org.apache.openejb.testing.MockInjector</a></p>
</li>
<li>
<p><a href="../../../latest/javadoc/org/apache/openejb/testing/Module.html">org.apache.openejb.testing.Module</a></p>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-sm-6 text-center-mobile">
<h3 class="white">Be simple. Be certified. Be Tomcat.</h3>
<h5 class="light regular light-white">"A good application in a good server"</h5>
<ul class="social-footer">
<li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li>
<li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li>
<li><a href="https://plus.google.com/communities/105208241852045684449"><i class="fa fa-google-plus"></i></a></li>
</ul>
</div>
<div class="col-sm-6 text-center-mobile">
<div class="row opening-hours">
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../../latest/docs/" class="white">Documentation</a></h5>
<ul class="list-unstyled">
<li><a href="../../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li>
<li><a href="../../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li>
<li><a href="../../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li>
<li><a href="../../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../../latest/examples/" class="white">Examples</a></h5>
<ul class="list-unstyled">
<li><a href="../../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li>
<li><a href="../../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li>
<li><a href="../../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li>
<li><a href="../../../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../../community/index.html" class="white">Community</a></h5>
<ul class="list-unstyled">
<li><a href="../../../community/contributors.html" class="regular light-white">Contributors</a></li>
<li><a href="../../../community/social.html" class="regular light-white">Social</a></li>
<li><a href="../../../community/sources.html" class="regular light-white">Sources</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../../security/index.html" class="white">Security</a></h5>
<ul class="list-unstyled">
<li><a href="http://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li>
<li><a href="http://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li>
<li><a href="http://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="row bottom-footer text-center-mobile">
<div class="col-sm-12 light-white">
<p>Copyright &copy; 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
</div>
</div>
</div>
</footer>
<!-- Holder for mobile navigation -->
<div class="mobile-nav">
<ul>
<li><a hef="../../../latest/docs/admin/index.html">Administrators</a>
<li><a hef="../../../latest/docs/developer/index.html">Developers</a>
<li><a hef="../../../latest/docs/advanced/index.html">Advanced</a>
<li><a hef="../../../community/index.html">Community</a>
</ul>
<a href="#" class="close-link"><i class="arrow_up"></i></a>
</div>
<!-- Scripts -->
<script src="../../../js/jquery-1.11.1.min.js"></script>
<script src="../../../js/owl.carousel.min.js"></script>
<script src="../../../js/bootstrap.min.js"></script>
<script src="../../../js/wow.min.js"></script>
<script src="../../../js/typewriter.js"></script>
<script src="../../../js/jquery.onepagenav.js"></script>
<script src="../../../js/tree.jquery.js"></script>
<script src="../../../js/highlight.pack.js"></script>
<script src="../../../js/main.js"></script>
</body>
</html>