Soliloquy
unspoken reflections of my heart
unspoken reflections of my heart
SOLILOQUY – \s?-li-l?-kw?\ – A dramatic monologue that represents a series of unspoken reflections
Heart is not an organ, it's an ornament – That which is embellished by a plethora of emotions like love, joys, care, worries, affection, sorrow, satire and peace. A mirror can be the best critic of our outer looks. The inner self is hidden, and at most times, the eyes of the world are oblivious to it. Soliloquy serves to be a revealing reflection of the gamut of thoughts that whirl through and in turn rule my heart. What I write is what I feel and what I feel is what I am.
Apr 3rd
LOCATION: Bangalore City Railway Station
TIME: 6:00 PM on a Friday
SCENE: Around 50 commuters, with varied levels of urgency, expectantly looking at the electronic train schedule display board.
What they did not realize for quite some time was that staring at that display board was not going to help. This was what it showed:
I am not sure whether the technicians at the railway station chose the rush hour for some live testing (some geeks call it UAT or QA testing…). Or did the 2012 railway budget include some provisions for test trains ??!
To compensate for the non-functional display board, there were computer monitors placed all around – there were too many of them. They were running Windows XP and the system admin did not know how to launch the schedule display software. Finally, he gave up and switched the display to this:
Looked like Lord Venkateshwara, the second richest God, had been summoned to revive the cash-strapped railways. But He could not help our angered passengers either. The saviour of the day was a lady sitting behind the ‘General Enquiry’ desk whose job of the day was to blurt out an integral number (platform number) at every train name that was thrown at her.
Just as I expected, the coach position displays on the platform were not functioning either. With much difficulty, I got into my compartment. As the train slowly chugged out of the station, I noticed the monitors on the platform showing the train schedules momentarily, only to be replaced by a tractor advertisement. How useful !!
Sep 2nd
விழைந்தேன் நீயெனை அறிவாயென
விழைந்தேன் நீயெனை அறிவாயென
விழைந்தபடி நீயெனை அறிந்தபின்னும்
விழைந்தேன் நீயெனை அறிவாயென
அறிவேன் உனைநான் எக்கணமும்
அறிவாய் நீயதை இக்கணமே
மன்னிப்பாய் ஏதும் தவறிழைத்தால்
மறவேன் எந்தன் தவறுகளை
எனக்கென சிலநொடி நான்கேட்டேன்
எனக்கென முழுவாழ்வு நீதந்தாய்
நான்கேட்ட சிலநொடி கிடைக்காமல்
எனக்கென சிலநொடி நான்கேட்டேன்
பலநொடி தந்ததை உணராமல்
உனக்கென சிலநொடி நீகேட்டாய்
என்னிடம் இல்லா உன்நொடியை
எங்கிருந்து தருவேன் உனக்கென
அறியாமல் நானும் வருந்தினேன்
அறியவே உனைநான் வருத்தினேன்
அறிந்தேன் நானதை இன்றே
அறிவாயே நீயதை நன்றே
நீ வருந்த நான் விழையேன்
நீ வாழ நான் விழைந்தேன்
உணர்வாய் நீயென் வாழ்வென
இதற்குமேல் உன்னிடம் சொல்ல என்ன ??
Sometimes, conversations do turn poetic !!!
P.S. This is my 100th blog post, with an equal contribution from Bliss
Jul 15th
சிந்தை மயக்கும் மழைச்சாரல்
கார்முகில் எனக்கின்று தந்ததே
சிந்தியது நீர்த்துளியோ இல்லை
கார்க்கோடல் மலரின் தேனோ
சிந்திய தேனும் நாவில்
கார்ப்பும் கலந்தினித்தது ஏனோ
சிந்தனையில் இதையெண்ணி மூழ்கிட
கார்வையும் தனியாகப் பாடவைத்தாய்
சிந்தூரம் அணிந்த நெற்றியும்
கார்வட்டம் சுழன்றாடும் கண்களும்
சிந்தாத மணிமாலைப் புன்னகையும்
கார்த்திகை தீபமெனப் பொலிவும்
சிந்தித்து சிந்தித்து என்இதயம்
காராக்கிருகம் எனக்கே இட்டதே…
Jun 19th
என்னைப் பார்க்கும் தருணம் முழுதும்
உன்னை நினைக்கிறேன்.
கண்ணாடியில்…
துளிகள் மண்ணில் விழுவதைப் பார்த்து
உன்னை நினைக்கிறேன்.
மழையின்…
நிலவைப் பார்த்த சாமத்தில் நானும்
உன்னை நினைக்கிறேன்.
வானில்…
பிம்பங்கள் நீரில் தெரிவதைக் கண்டு
உன்னை நினைக்கிறேன்.
நிலவின்…
இன்னிசை செவியில் கேட்கும் வேளையில்
உன்னை நினைக்கிறேன்.
குயிலின்…
வாசம் சுவாசம் துளைக்கின்ற நிமிடம்
உன்னை நினைக்கிறேன்.
மலரின்…
உயிரும் மெய்யும் ஒன்றாய்ச் சேர்ந்திட
உன்னை நினைக்கிறேன்.
தமிழின்…
என்னை நினைக்கும் நொடிகள் எல்லாம்
என்னை மறக்கிறேன்.
உன் இதயம்…
Jun 11th

Part 2 – Argument Matchers and Stubbing Void Methods
Mockito argument matchers can be used to specify the method arguments for stubbing. If the method has arguments but you really don’t care what gets passed or cannot predict it, argument matchers can be used.
Argument Matchers provide us a lot of flexibility in stubbing.
Argument Matchers use the equals() method for comparisons.
Let us assume we have an EmailService that is trying to save an email ID using an EmailManager. This means that the save() method of the EmailService calls the save() method of the EmailManager, which in turn saves the email to the database. A simple unit test for the save() method of the EmailService can test whether the save() on the Manager was called.
import org.junit.Test;
import org.mockito.Mockito;
public class EmailServiceTest {
@Test
public void testSaveEmail() {
EmailManager manager = Mockito.mock(EmailManager.class);
EmailService service = new EmailService(manager);
service.save("abc@xyz.com");
Mockito.verify(manager).save(Mockito.anyString());
}
}
Note the use of the argument matcher in line 12:
Mockito.verify(manager).save(Mockito.anyString());
We used the matcher because, we really do not care what parameter was passed on the save().
The generic any() matcher:
Mockito provides a matcher that matches any Object. Some valid variants of the above are:
Mockito.verify(manager).save(Mockito.any()); Mockito.verify(manager).save(Mockito.any(String.class));
The cast from Object to String is required in the first line, the lack of which will cause compilation error.
The second line shown above is most useful when we need to match custom classes we create in our application.
Assuming save() method saves a Person object, we would write:
Mockito.verify(manager).save(Mockito.any(Person.class));
While using argument matchers in stubbing, all arguments of a method must be matchers.
If our save method also takes in an integer, this line would throw error:
Mockito.verify(manager).save(12, Mockito.any(Person.class));
To fix the above scenario, we can write:
Mockito.verify(manager).save(Mockito.eq(12), Mockito.any(Person.class));
Some common Argument Matchers
| ARGUMENT MATCHERS | DESCRIPTION | |
|---|---|---|
| any() or any(Class | Any object (or object of a given class) or null | |
| anyString() anyInt() anyFloat() anyDouble() anyBoolean() anyByte() anyChar() | anyObject() anyCollection() anyList() anyMap() anySet() | Any object of given type or null |
| eq | Default Matcher. Compares using equals() method | |
| same | Object argument that is the same as the given value. Compares using == | |
| refEq | Object argument that is reflection-equal to the given value. This Matcher can be used when equals() is not implemented on compared objects. Matcher uses Java reflection API to compare fields of wanted and actual objects. | |
| isNull isNotNull | Argument is null/not null | |
| contains(String substring) matches(String regex) endsWith(String suffix) startsWith(String prefix) | String-specific argument matchers | |
Consider this scenario. We have the following classes:
We need to write test case for personLogic() method in PersonService
PersonService.java:
public class PersonService {
private final PersonManager manager;
public PersonService(PersonManager manager) {
this.manager = manager;
}
public void personLogic() {
Person person = new Person("Karthik", "abc@xyz.com");
manager.savePerson(person);
}
}
The below test will fail:
import org.junit.Test;
import org.mockito.Mockito;
public class PersonServiceTest {
@Test
public void testPersonLogic() {
PersonManager manager = Mockito.mock(PersonManager.class);
PersonService service = new PersonService(manager);
service.personLogic();
Person verifyPerson = new Person("Karthik", "abc@xyz.com");
Mockito.verify(manager).savePerson(verifyPerson);
}
}
Reason: The expected object, with reference verifyPerson is entirely different from the actual object, and the default equals() comparison which argument matchers use, fails.
Use Custom Argument Matcher
In this scenario, using custom argument matchers come in handy.
Lines 12 and 13 above can be replaced with this:
Mockito.verify(manager).savePerson(
Mockito.argThat(new ArgumentMatcher() {
@Override
public boolean matches(Object argument) {
Person person = (Person) argument;
return person.getName().equals("Karthik")
&& person.getEmail().equals("abc@xyz.com") ? true
: false;
}
}));
Alternate Solution – 1
Use the refEq matcher to compare the fields of the objects in hand:
Person verifyPerson = new Person("Karthik", "abc@xyz.com");
Mockito.verify(manager).savePerson(Mockito.refEq(verifyPerson));
Alternate Solution – 2
Override the equals() method in Person class to compare objects.
We face a lot of scenarios in our applications where we need to stub void methods. With void methods, stubbing is slightly different. We cannot use void methods in the when() call.
The alternative syntax is:
Mockito.doReturn(result).when(mock).method();
We can also test exception handling. How would my code handle if an exception is thrown by void methods
Mockito.doThrow(new RuntimeException()).when(mock).setAttribute(Mockito.anyString());
We can also set the behaviour of a void method to do nothing when called. This is not possible for non-void methods:
Mockito.doNothing().when(mock).method();
Why when() does not work for void methods:
Take a look at the syntax of when():
when(mock.method())
Notice that the method is called inside brackets. Compiler does not like void method inside brackets!!
The two ‘when()’ are different syntax.
Notice that the when() for a non-void method stubbing takes in a methodCall as parameter, whereas the when() in void method stubbing takes in a mock object.
| STUBBING WITH MOCKITO | USAGE |
|---|---|
| do | Primarily used for stubbing void methods |
| doCallRealMethod().when(mock).method(); doNothing().when(mock).method(); doThrow(Throwable... throwables).when(mock).method(); doReturn(T value).when(mock).method(); doAnswer(Answer> answer).when(mock).method(); |
|
Future articles in the series:
May 31st
Part 1 – Getting Started with Mockito
Mocking Frameworks allow us to test the code you want, without its dependencies. In a unit test, mock objects can simulate the behaviour of complex objects that are impractical or impossible to incorporate into a unit test.
Mock objects isolate the unit of code you are testing.
This is a framework used for test stubbing and interaction testing.
Let us assume that we have a simple servlet, and a method testCheckFormat() that checks the format of the email id submitted in the HTML form. It is impractical to create an actual HttpServletRequest object for unit test. So we mock this object, in order to test the code we are interested in.
import javax.servlet.http.HttpServletRequest;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
public class ServletFacadeTest {
@Test
public void testCheckFormat() {
HttpServletRequest requestMock = Mockito.mock(HttpServletRequest.class);
Mockito.when(requestMock.getAttribute("email")).thenReturn("xyz@abc.com");
ServletFacade servletFacade = new ServletFacade();
boolean result = servletFacade.checkFormat(requestMock);
Assert.assertEquals(true, result);
}
}
There are three fundamental steps in writing JUnit test cases with Mockito:
One of the most important capabilities of Mockito is to verify whether the mock had any interactions. A mock object will remember all its invocations.
The following test would have passed in the above case:
Mockito.verify(requestMock).getAttribute("email");
It is also easy to ensure that there were no more interactions with our mock apart from getting the email:
Mockito.verify(requestMock).getAttribute("email");
Mockito.verifyNoMoreInteractions(requestMock);
Let’s assume that our logic now tries retrieving two details from the request, namely email and name. To test two invocations, we now can use:
Mockito.verify(requestMock).getAttribute("email");
Mockito.verify(requestMock).getAttribute("name");
We can write this slightly differently, using argument matchers provided by Mockito:
Mockito.verify(requestMock, Mockito.times(2)).getAttribute(Mockito.anyString());
Verifying a stubbed invocation is unnecessary and often leads to just redundant tests!
| METHODS FOR VERIFICATION | DESCRIPTION |
|---|---|
| verify( T mock).someMethod(); verify( T mock, times(int n) ).someMethod(); verify( T mock, atLeast(int n) ).someMethod(); verify( T mock, atLeastOnce() ).someMethod(); verify( T mock, atMost(int n) ).someMethod(); verify( T mock, never() ).someMethod(); | Verify that someMethod was called specified number of times. Default is once. |
| verifyZeroInteractions( Object... mocks ); | Verify that there have been no method calls on the mock object(s) |
| verifyNoMoreInteractions( Object... mocks ) | Verify that there have been no additional method calls on the mock object(s) besides what has already been verified. |
Stubbing is used to specify method behaviors on mock objects.
We have already seen an example of stubbing:
Mockito.when(requestMock.getAttribute("email")).thenReturn("xyz@abc.com");
Argument matchers can be used in stubs to match the invocation with any specified argument:
In the below example, any invocation of getAttribute() with a String parameter will return the string “xyz@abc.com”.
Mockito.when(requestMock.getAttribute(Mockito.anyString()))
.thenReturn("xyz@abc.com");
Sometimes, we might have to test exception handling. How would my code handle if an exception is thrown by getAttribute()
Mockito.when(requestMock.getAttribute(Mockito.anyString())).thenThrow(new RuntimeException());
when() would work only for non-void methods!
| STUBBING WITH MOCKITO | USAGE |
|---|---|
| when | Only for non-void methods |
| when( mock.method() ).thenCallRealMethod(); when( mock.method() ).thenReturn(T value); when( mock.method() ).thenReturn(T value, T... values); when( mock.method() ).thenThrow(Throwable... throwables); when( mock.method() ).thenAnswer(Answer> answer); |
|
This should get you started with some basic unit tests with Mockito. Have fun !!
Future articles in the series: