<div dir="ltr"><h2 style="margin:0px 0px 10px;padding:0px;font-size:24px;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(204,204,204);color:rgb(0,0,0);font-family:Helvetica,arial,freesans,clean,sans-serif">
Simplifying Route testing</h2><p style="margin:0px 0px 15px;color:rgb(0,0,0);font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:14px;line-height:22px">For <a href="https://issues.jboss.org/browse/AEROGEAR-778" style="color:rgb(65,131,196);text-decoration:initial">AEROGEAR-778</a> we have been looking into making it easier to test routes. We have been using Mockito which works nicely, but there was a bit of duplicated code spread across different tests and also the test were not that easy to read.<br>
Below are examples of one of the tests before and after, hopefully the after will be easier to read. </p><p style="margin:0px 0px 15px;color:rgb(0,0,0);font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:14px;line-height:22px">
<span style="font-size:18px;line-height:normal">Before</span></p><div class="" style="border:0px;padding:0px;color:rgb(0,0,0);font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:14px;line-height:22px"><pre style="font-size:13px;line-height:19px;font-family:Consolas,'Liberation Mono',Courier,monospace;word-wrap:break-word;margin-top:15px;margin-bottom:15px;background-color:rgb(248,248,248);border:1px solid rgb(204,204,204);overflow:auto;padding:6px 10px;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">
<span class="">@Test</span>
<span class="" style="font-weight:bold">public</span> <span class="" style="color:rgb(68,85,136);font-weight:bold">void</span> <span class="" style="color:rgb(153,0,0);font-weight:bold">testRestRouteWithPathParam</span><span class="" style="font-weight:bold">()</span> <span class="" style="font-weight:bold">throws</span> <span class="" style="color:rgb(51,51,51)">Exception</span> <span class="" style="font-weight:bold">{</span>
<span class="" style="font-weight:bold">final</span> <span class="" style="color:rgb(51,51,51)">RoutingModule</span> <span class="" style="color:rgb(51,51,51)">routingModule</span> <span class="" style="font-weight:bold">=</span> <span class="" style="font-weight:bold">new</span> <span class="" style="color:rgb(51,51,51)">AbstractRoutingModule</span><span class="" style="font-weight:bold">()</span> <span class="" style="font-weight:bold">{</span>
<span class="">@Override</span>
<span class="" style="font-weight:bold">public</span> <span class="" style="color:rgb(68,85,136);font-weight:bold">void</span> <span class="" style="color:rgb(153,0,0);font-weight:bold">configuration</span><span class="" style="font-weight:bold">()</span> <span class="" style="font-weight:bold">{</span>
<span class="" style="color:rgb(51,51,51)">route</span><span class="" style="font-weight:bold">()</span>
<span class="" style="font-weight:bold">.</span><span class="" style="color:teal">from</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(221,17,68)">"/car/{id}"</span><span class="" style="font-weight:bold">).</span><span class="" style="color:teal">roles</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(221,17,68)">"admin"</span><span class="" style="font-weight:bold">)</span>
<span class="" style="font-weight:bold">.</span><span class="" style="color:teal">on</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">GET</span><span class="" style="font-weight:bold">)</span>
<span class="" style="font-weight:bold">.</span><span class="" style="color:teal">produces</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">mockJsp</span><span class="" style="font-weight:bold">(),</span> <span class="" style="color:rgb(51,51,51)">mockJson</span><span class="" style="font-weight:bold">())</span>
<span class="" style="font-weight:bold">.</span><span class="" style="color:teal">to</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">SampleController</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">class</span><span class="" style="font-weight:bold">).</span><span class="" style="color:teal">find</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">param</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(221,17,68)">"id"</span><span class="" style="font-weight:bold">));</span>
<span class="" style="font-weight:bold">}</span>
<span class="" style="font-weight:bold">};</span>
<span class="" style="font-weight:bold">final</span> <span class="" style="color:rgb(51,51,51)">Routes</span> <span class="" style="color:rgb(51,51,51)">routes</span> <span class="" style="font-weight:bold">=</span> <span class="" style="color:rgb(51,51,51)">routingModule</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">build</span><span class="" style="font-weight:bold">();</span>
<span class="" style="color:rgb(51,51,51)">when</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">request</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">getMethod</span><span class="" style="font-weight:bold">()).</span><span class="" style="color:teal">thenReturn</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">RequestMethod</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">GET</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">toString</span><span class="" style="font-weight:bold">());</span>
<span class="" style="color:rgb(51,51,51)">when</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">request</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">getServletContext</span><span class="" style="font-weight:bold">()).</span><span class="" style="color:teal">thenReturn</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">servletContext</span><span class="" style="font-weight:bold">);</span>
<span class="" style="color:rgb(51,51,51)">when</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">servletContext</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">getContextPath</span><span class="" style="font-weight:bold">()).</span><span class="" style="color:teal">thenReturn</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(221,17,68)">"/abc"</span><span class="" style="font-weight:bold">);</span>
<span class="" style="color:rgb(51,51,51)">when</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">request</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">getRequestURI</span><span class="" style="font-weight:bold">()).</span><span class="" style="color:teal">thenReturn</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(221,17,68)">"/abc/car/3"</span><span class="" style="font-weight:bold">);</span>
<span class="" style="color:rgb(51,51,51)">when</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">request</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">getHeader</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(221,17,68)">"Accept"</span><span class="" style="font-weight:bold">)).</span><span class="" style="color:teal">thenReturn</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(221,17,68)">"application/json"</span><span class="" style="font-weight:bold">);</span>
<span class="" style="color:rgb(51,51,51)">when</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">jsonResponder</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">accepts</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(221,17,68)">"application/json"</span><span class="" style="font-weight:bold">)).</span><span class="" style="color:teal">thenReturn</span><span class="" style="font-weight:bold">(</span><span class="" style="font-weight:bold">true</span><span class="" style="font-weight:bold">);</span>
<span class="" style="color:rgb(51,51,51)">when</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">jsonResponder</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">mediaType</span><span class="" style="font-weight:bold">()).</span><span class="" style="color:teal">thenReturn</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">mockJson</span><span class="" style="font-weight:bold">());</span>
<span class="" style="font-weight:bold">final</span> <span class="" style="color:rgb(51,51,51)">Route</span> <span class="" style="color:rgb(51,51,51)">route</span> <span class="" style="font-weight:bold">=</span> <span class="" style="color:rgb(51,51,51)">routes</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">routeFor</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">GET</span><span class="" style="font-weight:bold">,</span> <span class="" style="color:rgb(221,17,68)">"/car/{id}"</span><span class="" style="font-weight:bold">,</span> <span class="" style="color:rgb(51,51,51)">acceptHeaders</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">JSON</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">getMediaType</span><span class="" style="font-weight:bold">()));</span>
<span class="" style="color:rgb(51,51,51)">router</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">process</span><span class="" style="font-weight:bold">(</span><span class="" style="font-weight:bold">new</span> <span class="" style="color:rgb(51,51,51)">RouteContext</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">route</span><span class="" style="font-weight:bold">,</span> <span class="" style="color:rgb(51,51,51)">request</span><span class="" style="font-weight:bold">,</span> <span class="" style="color:rgb(51,51,51)">response</span><span class="" style="font-weight:bold">,</span> <span class="" style="color:rgb(51,51,51)">routes</span><span class="" style="font-weight:bold">));</span>
<span class="" style="color:rgb(51,51,51)">verify</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">jsonResponder</span><span class="" style="font-weight:bold">).</span><span class="" style="color:teal">respond</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">anyObject</span><span class="" style="font-weight:bold">(),</span> <span class="" style="color:rgb(51,51,51)">any</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">RouteContext</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">class</span><span class="" style="font-weight:bold">));</span>
<span class="" style="font-weight:bold">}</span>
</pre></div><h3 style="margin:20px 0px 10px;padding:0px;font-size:18px;color:rgb(0,0,0);font-family:Helvetica,arial,freesans,clean,sans-serif"><a name="after" class="" href="https://gist.github.com/danbev/4983976#after" style="color:rgb(65,131,196);text-decoration:initial;display:block;padding-left:30px"></a>After</h3>
<div class="" style="border:0px;padding:0px;color:rgb(0,0,0);font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:14px;line-height:22px;margin-bottom:0px!important"><pre style="font-size:13px;line-height:19px;font-family:Consolas,'Liberation Mono',Courier,monospace;word-wrap:break-word;margin-top:15px;margin-bottom:15px;background-color:rgb(248,248,248);border:1px solid rgb(204,204,204);overflow:auto;padding:6px 10px;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">
<span class="">@Test</span>
<span class="" style="font-weight:bold">public</span> <span class="" style="color:rgb(68,85,136);font-weight:bold">void</span> <span class="" style="color:rgb(153,0,0);font-weight:bold">testRestRouteWithPathParam</span><span class="" style="font-weight:bold">()</span> <span class="" style="font-weight:bold">throws</span> <span class="" style="color:rgb(51,51,51)">Exception</span> <span class="" style="font-weight:bold">{</span>
<span class="" style="font-weight:bold">final</span> <span class="" style="color:rgb(51,51,51)">RouteTester</span> <span class="" style="color:rgb(51,51,51)">routeTester</span> <span class="" style="font-weight:bold">=</span> <span class="" style="color:rgb(51,51,51)">RouteTester</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">from</span><span class="" style="font-weight:bold">(</span><span class="" style="font-weight:bold">new</span> <span class="" style="color:rgb(51,51,51)">AbstractRoutingModule</span><span class="" style="font-weight:bold">()</span> <span class="" style="font-weight:bold">{</span>
<span class="">@Override</span>
<span class="" style="font-weight:bold">public</span> <span class="" style="color:rgb(68,85,136);font-weight:bold">void</span> <span class="" style="color:rgb(153,0,0);font-weight:bold">configuration</span><span class="" style="font-weight:bold">()</span> <span class="" style="font-weight:bold">{</span>
<span class="" style="color:rgb(51,51,51)">route</span><span class="" style="font-weight:bold">()</span>
<span class="" style="font-weight:bold">.</span><span class="" style="color:teal">from</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(221,17,68)">"/car/{id}"</span><span class="" style="font-weight:bold">).</span><span class="" style="color:teal">roles</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(221,17,68)">"admin"</span><span class="" style="font-weight:bold">)</span>
<span class="" style="font-weight:bold">.</span><span class="" style="color:teal">on</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">GET</span><span class="" style="font-weight:bold">)</span>
<span class="" style="font-weight:bold">.</span><span class="" style="color:teal">produces</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">JSP</span><span class="" style="font-weight:bold">,</span> <span class="" style="color:rgb(51,51,51)">JSON</span><span class="" style="font-weight:bold">)</span>
<span class="" style="font-weight:bold">.</span><span class="" style="color:teal">to</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">SampleController</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">class</span><span class="" style="font-weight:bold">).</span><span class="" style="color:teal">find</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">param</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(221,17,68)">"id"</span><span class="" style="font-weight:bold">));</span>
<span class="" style="font-weight:bold">}</span>
<span class="" style="font-weight:bold">});</span>
<span class="" style="color:rgb(51,51,51)">routeTester</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">acceptHeader</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">JSON</span><span class="" style="font-weight:bold">).</span><span class="" style="color:teal">processGetRequest</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(221,17,68)">"/car/3"</span><span class="" style="font-weight:bold">);</span>
<span class="" style="color:rgb(51,51,51)">verify</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">routeTester</span><span class="" style="font-weight:bold">.<</span><span class="" style="color:rgb(51,51,51)">SampleController</span><span class="" style="font-weight:bold">></span><span class="" style="color:rgb(51,51,51)">getController</span><span class="" style="font-weight:bold">()).</span><span class="" style="color:teal">find</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(221,17,68)">"3"</span><span class="" style="font-weight:bold">);</span>
<span class="" style="color:rgb(51,51,51)">verify</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">routeTester</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">jsonResponder</span><span class="" style="font-weight:bold">()).</span><span class="" style="color:teal">respond</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">any</span><span class="" style="font-weight:bold">(),</span> <span class="" style="color:rgb(51,51,51)">any</span><span class="" style="font-weight:bold">(</span><span class="" style="color:rgb(51,51,51)">RouteContext</span><span class="" style="font-weight:bold">.</span><span class="" style="color:teal">class</span><span class="" style="font-weight:bold">));</span>
<span class="" style="font-weight:bold">}</span></pre></div></div>