<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[BlogtimeException]]></title>
  <link href="http://blog.behrang.org/atom.xml" rel="self"/>
  <link href="http://blog.behrang.org/"/>
  <updated>2012-09-25T23:06:31+10:00</updated>
  <id>http://blog.behrang.org/</id>
  <author>
    <name><![CDATA[Behrang Saeedzadeh]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Stubbing java.util.Calendar in Grails Test Cases, The Bad Parts]]></title>
    <link href="http://blog.behrang.org/blog/2012/09/25/stubbing-java-dot-util-dot-calendar-in-grails-test-cases/"/>
    <updated>2012-09-25T22:59:00+10:00</updated>
    <id>http://blog.behrang.org/blog/2012/09/25/stubbing-java-dot-util-dot-calendar-in-grails-test-cases</id>
    <content type="html"><![CDATA[<p>After a happy couple of weeks, the method I had written about <a href="http://blog.behrang.org/blog/2012/09/09/stubbing-java-dot-util-dot-calendar-in-grails-test-cases/">here</a> started to fall apart, at least in acceptance tests.</p>

<p>The issue was that in some acceptance tests, the Geb framework was using <code>java.util.Calendar</code> internally, and now as the Calendar was stubbed globally, it wasn&#8217;t working correctly anymore.</p>

<p>Thankfully, this issue was easily solved with a layer of redirection: I modified my code to use a &#8220;utils&#8221; class to access Calendar, and then when need be I stubbed the utils class instead.</p>

<figure class='code'><figcaption><span>DateUtils</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">DateUtils</span> <span class="o">{</span>
</span><span class='line'>  <span class="kt">boolean</span> <span class="nf">isTodayMonday</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="kt">def</span> <span class="n">cal</span> <span class="o">=</span> <span class="n">Calendar</span><span class="o">.</span><span class="na">getInstance</span><span class="o">()</span>
</span><span class='line'>      <span class="k">return</span> <span class="n">cal</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">Calendar</span><span class="o">.</span><span class="na">DAY_OF_WEEK</span><span class="o">)</span> <span class="o">==</span> <span class="n">Calendar</span><span class="o">.</span><span class="na">MONDAY</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Stubbing DateUtils to always return true when isTodayMonday is called</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">DateUtils</span><span class="o">.</span><span class="na">metaClass</span><span class="o">.</span><span class="na">static</span><span class="o">.</span><span class="na">isTodayMonday</span> <span class="o">=</span> <span class="o">{</span> <span class="n">Calendar</span><span class="o">.</span><span class="na">MONDAY</span> <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Geb Navigator.text() issues]]></title>
    <link href="http://blog.behrang.org/blog/2012/09/25/geb-navigator-dot-text-issues/"/>
    <updated>2012-09-25T22:03:00+10:00</updated>
    <id>http://blog.behrang.org/blog/2012/09/25/geb-navigator-dot-text-issues</id>
    <content type="html"><![CDATA[<p>Wasted a couple of hours today on debugging a Geb issue: <code>Navigator.text()</code> was not working as expected.</p>

<p>According to the API docs, it &#8220;Returns the text content of the first context element&#8221;, but it was returning an empty string for me, even though it was matching an element that had some text within.</p>

<p>In the end, it turned out <code>Navigator.text()</code> returns an empty string if the element it matches is hidden (e.g. it has a <code>display:none</code> CSS style).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Stubbing java.util.Calendar in Grails test cases]]></title>
    <link href="http://blog.behrang.org/blog/2012/09/09/stubbing-java-dot-util-dot-calendar-in-grails-test-cases/"/>
    <updated>2012-09-09T21:02:00+10:00</updated>
    <id>http://blog.behrang.org/blog/2012/09/09/stubbing-java-dot-util-dot-calendar-in-grails-test-cases</id>
    <content type="html"><![CDATA[<p>Sometime ago at work I needed to unit-test a Groovy class that was using <code>java.util.Calendar</code> in method-local scope. The SUT (system under test) was similar to the following <code>DateUtils</code> class:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">DateUtils</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">static</span> <span class="kt">def</span> <span class="nf">isTodayMonday</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">Calendar</span> <span class="n">now</span> <span class="o">=</span> <span class="n">Calendar</span><span class="o">.</span><span class="na">getInstance</span><span class="o">()</span>
</span><span class='line'>        <span class="kt">int</span> <span class="n">currentDayOfWeek</span> <span class="o">=</span> <span class="n">now</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">Calendar</span><span class="o">.</span><span class="na">DAY_OF_WEEK</span><span class="o">)</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">Calendar</span><span class="o">.</span><span class="na">MONDAY</span> <span class="o">==</span> <span class="n">currentDayOfWeek</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In order to unit-test <code>DateUtils.isTodayMonday()</code>, we need two test cases:</p>

<ol>
<li>A test case that demonstrates that <code>isTodayMonday()</code> returns true if <code>java.util.Calendar</code> returns <code>Calendar.MONDAY</code> as the current day of week, and</li>
<li>A test case that demonstrates that <code>isTodayMonday()</code> returns false if <code>java.util.Calendar</code> returns anything other than <code>Calendar.MONDAY</code> as the current day of week.</li>
</ol>


<p>As you know, it is not easy to stub <code>Calendar.getInstance()</code> and <code>Calendar.get(int)</code> in Java when they are used like this. However in Groovy maps can be coerced into classes at runtime and this simplifies writing our unit test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="nd">@Test</span>
</span><span class='line'><span class="kt">void</span> <span class="nf">isTodayMondayShouldReturnTrueIfTodayIsMonday</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="c1">// Create a calendar stub that always returns MONDAY for the current day of week</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">stubCalendar</span> <span class="o">=</span> <span class="o">[</span><span class="nl">get:</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">field</span> <span class="o">-&gt;</span> <span class="n">Calendar</span><span class="o">.</span><span class="na">MONDAY</span><span class="o">}]</span> <span class="k">as</span> <span class="n">Calendar</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Override Calendar.getInstance() so that it always returns our calendar stub</span>
</span><span class='line'>    <span class="n">Calendar</span><span class="o">.</span><span class="na">metaClass</span><span class="o">.</span><span class="na">static</span><span class="o">.</span><span class="na">getInstance</span> <span class="o">=</span> <span class="o">{</span> <span class="n">stubCalendar</span> <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">assert</span> <span class="n">DateUtils</span><span class="o">.</span><span class="na">isTodayMonday</span><span class="o">()</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@Test</span>
</span><span class='line'><span class="kt">void</span> <span class="nf">isTodayMondayShouldReturnFalseIfTodayIsNotMonday</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="c1">// Create a calendar stub that does not return MONDAY, (e.g. returns TUESDAY) for the current day of week</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">stubCalendar</span> <span class="o">=</span> <span class="o">[</span><span class="nl">get:</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">field</span> <span class="o">-&gt;</span> <span class="n">Calendar</span><span class="o">.</span><span class="na">TUESDAY</span><span class="o">}]</span> <span class="k">as</span> <span class="n">Calendar</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Override Calendar.getInstance() so that it always returns our calendar stub</span>
</span><span class='line'>    <span class="n">Calendar</span><span class="o">.</span><span class="na">metaClass</span><span class="o">.</span><span class="na">static</span><span class="o">.</span><span class="na">getInstance</span> <span class="o">=</span> <span class="o">{</span> <span class="n">stubCalendar</span> <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">assert</span> <span class="n">DateUtils</span><span class="o">.</span><span class="na">isTodayMonday</span><span class="o">()</span> <span class="o">==</span> <span class="kc">false</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In a later post I&#8217;ll explain why I prefer this approach over using Grails&#8217; built-in <code>StubFor</code>.</p>

<p><em>Note: I have simplified this unit test by not testing for all days of the week. Otherwise in a more rigorous test suite, one would probably write one test case per each day of the week.</em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Agile, an over(ab)used term]]></title>
    <link href="http://blog.behrang.org/blog/2012/05/08/agile/"/>
    <updated>2012-05-08T01:07:00+10:00</updated>
    <id>http://blog.behrang.org/blog/2012/05/08/agile</id>
    <content type="html"><![CDATA[<p>Earlier today I was thinking about the overuse of the term &#8220;agile&#8221; in the industry and how
disturbing and distractive it is. Then, now at night, I stumbled upon
<a href="http://weblog.jamisbuck.org/2008/11/9/legos-play-doh-and-programming">this</a>:</p>

<blockquote><p>DI frameworks are unnecessary.
In more rigid environments, they have value.
In agile environments like Ruby, not so much.
The patterns themselves may still be applicable,
but beware of falling into the trap of thinking you
need a special tool for everything. Ruby is Play-Doh,
remember! Let’s keep it that way.</p></blockquote>

<p>Dude! Ruby is not an agile environment! Ruby is only a dynamically typed language
just like JavaScript, LISP, and what not. Let&#8217;s keep it that way! Stop abusing &#8220;agile&#8221;.</p>

<p>This also reminded me about <a href="http://folklore.org/StoryView.py?story=Swedish_Campground.txt">this</a>
fascinating story about Steve Jobs and overuse of the Apple logo in Mac OS menus:</p>

<blockquote><p>There are too many Apples on the screen! It&#8217;s ridiculous!
We&#8217;re taking the Apple logo in vain! We&#8217;ve got to stop doing that!</p></blockquote>

<p>Now I am not an agile zealot of any sorts, but if you are, if you care about it, and
if you believe in it, then stop over(ab)using it.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ruby's optional method parentheses]]></title>
    <link href="http://blog.behrang.org/blog/2012/05/06/rubys-optional-method-parentheses/"/>
    <updated>2012-05-06T01:36:00+10:00</updated>
    <id>http://blog.behrang.org/blog/2012/05/06/rubys-optional-method-parentheses</id>
    <content type="html"><![CDATA[<p>While it leads to good looking and readable DSLs, as there&#8217;s not a <em>strict</em> rule
for when to use parentheses and when not to, it adds another type of coding style
inconsistency to code written by a team of programmers.</p>
]]></content>
  </entry>
  
</feed>
