Friday, 24 April 2009

Array Access Evaluation Order in Java

Consider the java program written below and then guess its output.
public class ArrayEvaluationOrder {
public static void main(String[] args) 
{

int[] aryA = { 10, 20, 30, 40, 50, 60 };
int[] aryB = { 1, 2, 3, 4, 5, 6 };

System.out.println(aryA[(aryA=aryB)[4]]); //1
System.out.println(aryA[(aryA=aryA)[4]]); //2
System.out.println(aryA[(aryA=aryB)[3]]); //3
}
}
The output is:
60
6
5

If you are scratching your head, let me be of some assistance and explain the reason behind this.

As per Array Access Evaluation Order in java, in case of an array access, the expression to the left of the brackets is fully evaluated before any part of the expression within the brackets is evaluated.

For example consider the following line of code:
System.out.println(aryA[(aryA=aryB)[4]]); 
The expression aryA is fully evaluated before the expression (aryA=aryB)[4] is evaluated. This means that the original value of aryA is fetched and remembered while the expression (aryA=aryB)[4] i.e. 5 is evaluated.

Since aryA still remembers its original value aryA[5] returns 60. But after the execution of this line, aryA and aryB both would be pointing to array pointed to by aryB.

I would leave figuring out the rest of the output to you.

Monday, 20 April 2009

Scrum Vs XP

I keep on seeing people debating about the differences between Scrum and XP. It’s quite interesting to hear the different advantages people suggest of one approach over the other. I am listing down the differences as per my understanding of each methodology.

• Scrum concentrates more on project management aspects of software development where as XP is more focused towards the engineering disciplines. It’s very much possible to follow all the XP engineering practices in a Scrum project. I have heard a lot of people say that pair programming is not allowed in an XP project. I don’t particularly agree with that. Remember Agile is not about following something blindly, it’s about being proactive and deliver maximum value in each release. If a team thinks pair programming or for that matter any XP engineering practice helps them do that, I tell them to have a go.

• Each development life cycle in a Scrum is called a Sprint where as in XP it is referred to as Iteration.

• XP teams work in a strict priority order. All the features to be developed are prioritized by the customer or Product Owner and team works on the features in that order. In Scrum the team is free to pick up the features to be developed. Though the Product Owner does specify the priority of the features, it is up to the team to choose the sequence in which the features would be developed.

• Scrum sprints last from 1-4 weeks where as an XP iteration is generally 1-2 or maximum 3 weeks long.

• Scrum teams strictly do not allow a change in the sprint backlog once a sprint has started. If the change is really mandatory, the sprint is ended midway and a new sprint is started. XP teams are much more adaptable to change with in iterations. As long as team believes they can deliver an extra/changed story without hampering the quality of the rest of the features, a change can be accepted in the iteration plan. I favour Scrum more in this particular context as I don’t really admire allowing a change once the iteration as started. I believe the responsibility of convincing the Product Owner to not to come up with a change request or a new story, during an iteration, lies with the Project Manager or the Scrum Master.

• Scrum does not suggest any engineering practices. Scrum is more flexible that way and leaves it to the team to adopt and implement the engineering disciplines as per their project requirement and their comfort level with those practices. XP is very strict in terms of engineering practices. It forces the team to follow various engineering practices like Test driven development (TDD), Pair programming, Automated Testing, Continuous Integration, Refactoring etc.

All the content written above is as per my understanding of the two methodologies. If you think I am wrong or there is something which needs any amendment or you have any query please write to me at ravinder.rawat@gmail.com.

Wednesday, 15 April 2009

Microsoft Cloud

Lately I have been reading articles on this new and promising technology phenomena called Cloud Computing and I came across this really good article on the Microsoft's new initiative on cloud computing called Microsoft Cloud. Its basically a synopsis of Microsoft Chief Software Architect, Ray Ozzie's speech at Microsoft's annual Financial Analyst Meeting (FAM). I would strongly recommend it to all who want to keep themselves abreast with emerging technologies or in particular cloud computing.
http://www.readwriteweb.com/archives/peering_into_microsofts_cloud.php

Tuesday, 14 April 2009

A simple OOPS concept

In this post I am going to discuss a simple OOPS concept. Consider the code snippet below.
class Base{}



class Derived extends Base
{
public void func()
{
System.out.println(“Inside the Derived class”);
}
}


public class Test
{
public static void main (String args[])
{
Base b = new Derived();
b.func();
}
}

What would happen if I try to compile and run the above code?
There are a few who might say that it would print “Insider the derived class”. The reason – Since at runtime the object that is created is a derived class object, it can call the method func(). But actually the code would not even compile. I agree that if the code would have compiled fine it would have called the func() method of the derived class but the problem is the compiler would not allow you to proceed because it does not see a func() method in the base class and thus b.func() would give a compile time error.

I agree a lot of you already feel like shouting ‘Come on codeguru… even a person who learnt OOPS from ‘OOPS for Dummies’ knows that’. But actually I have been interviewing candidates for a while and one common mistake a lot of candidates make is around this concept. Though it seems to be a very basic concept of OOPS, I have seen candidates with more than 2-3 years of experience failing to give a suitable reply. So I thought of including this in my blog. Sorry if it looks like that I have doubted your PQ(Programming Quotient). Remember we all started from the first step of the ladder and there are still a lot of them trying to do so.

Monday, 13 April 2009

Mocking

In this article I will explain a unit testing concept called Mocking. We will also discuss a couple of examples based on EasyMock library.

Unit testing is an integral part of any software development cycle. It is the process using, which a programmer makes sure that the piece of code he/she has developed does what it is supposed to do. In more specific terms a unit test can be defined as the test of a single isolated component that can be done repeatedly. There are various tools available for doing unit testing like Nunit, JUnit etc.

Testing units of code often is a problem because mostly, the components of a software application do not work in isolation but collaborate with other components to get the job done. But in unit testing we don’t want to test the depending objects, but the unit under test. Mocking provides a solution to this problem. All the collaborating objects which are not to be tested can be passed as the ’mock’ objects after setting up their behaviour for the life cycle of the test.
Mock objects are not to be confused with mocks or stubs, which is another library to facilitate the testing of a unit with dependencies.

The basic idea behind Mock Objects is that the dependencies are resolved on the fly with in the test itself. EasyMock provides Mock Objects for interfaces in JUnit tests by generating them on the fly using Java's proxy mechanism.

Let me explain this concept by a very basic example. I have used Easymock for mocking the objects. Consider the following class:
public class Employee 
{
public Employee(String fName, String lName)
{
firstName = fName;
lastName = lName; 
}
private String firstName = null;
private String lastName = null;

public String getFirstName()
{
return firstName;
}


public String getLastName()
{
return lastName;
}

public String displayNameWithDepartment(IDepartment dpt)
{
return firstName+” ”+lastName+” ”+dpt.getName();
}
}

There is an interface IDepartment which is used by our Employee class.
public class IDepartment 
{
public String getName();
public String getHODName();
}

Now let’s consider testing of Employee class. What do we want to test, and how do we go about it. We are mainly interested in the way that our implementation class collaborates with its dependencies. We need to make sure that our class behaves correctly, when interacting with these parameters. We want to make sure that the right methods are called in the right order with the right parameters, but it is not used.
Obviously, in order to test the Employee class’s behaviour we will have to pass it a IDepartment reference but which need not be an actual object.
Lets create an example JUnit test, which shows the EasyMock at work
import static org.easymock.EasyMock.*;
import junit.framework.*;
//other imports omitted

public class EasyMockTest extends TestCase
{
public void testWithMockObjects() throws Exception
{
// strict mock forces us to specify the correct order of method calls
IDepartment dpt = createStrictMock(IDepartment.class); //1

expect(dpt.getName()).andReturn("Development"); // 2

//unexpected method calls after this point will throw exceptions
replay(dpt); //3

Employee emp = new Employee(“Michael”, “Sheen”); //4

assert(emp.displayNameWithDepartment(dpt), “Michael Sheen Development”) //5
//check that the behaviour expected is actually
verify(request); //6
}
//more test methods omitted ...
}

EasyMockTest class tests the behaviour of the displayNameWithDepartment() method in a specific scenario.

Let’s walk through each line of code and find out what it is doing.
1. We ask EasyMock to create dynamic proxy implementing IDepartment, which starts in record mode.
2. Record a method call along with the expected result.
3. replay() call tells EasyMock to stop recording. If we don’t call replay(), a call to dpt.getName() would return null.
4. Create the Employee object that needs to be tested.
5. Call on the mock object returns the set value. If it gets a call it does not expects, it throws an exception.
6. Verifies that only the method calls which were recorded were played. If we make a method call which was not recorded, an ‘Unexpected method call’ error is thrown. Moreover all the method calls which were recorded need to be made.

Note: Methods on the mock object would return the result in the same order in which the expectations were recorded/set on them. If the order does not match our test case is going to fail.
For example if our test case contains following lines of code, it’s going to fail:
expect(dpt.getName()).andReturn("Development"); //Development first
expect(dpt.getName()).andReturn("HR"); //HR second  
replay(dpt);
Employee emp = new Employee("Michael", "Sheen");
assertEquals(emp.displayNameWithDepartment(dpt), "Michael Sheen HR"); //HR first
assertEquals(emp.displayNameWithDepartment(dpt), "Michael Sheen Development");
verify(dpt);

Multiple calls
If a method on a mock object is to be called multiple times, we can use times() method. So if in the above example, I want to set multiple expectations with same arguments, I can use following the following line of code
expect(dpt.getName()).andReturn("Development").times(2);

reset method()
In the above example, the test method has a single replay() and verify() call with single expectation setting and verification phases. Sometimes it is convenient to reuse the same mock object over multiple expectation setting, replay and verification cycles. But the problem is once a mock object has been verified, it cannot record a method call. If we try to do that, an ‘Unexpected method call name’ error is thrown.
reset() method is used to set the mock object back to the expectation setting mode.
For example consider the following two scenarios:
Without reset()
expect(dpt.getName()).andReturn("Development");
replay(dpt);
Employee emp = new Employee("Michael", "Sheen");
assertEquals(emp.displayNameWithDepartment(dpt), " Michael Sheen Development");
verify(dpt);
expect(dpt.getName()).andReturn("Development");  //Error
replay(dpt);
assertEquals(emp.displayNameWithDepartment(dpt), "Michael Sheen Development");
verify(dpt);
With reset()
expect(dpt.getName()).andReturn("Development");
replay(dpt);
Employee emp = new Employee("Michael", "Sheen");
assertEquals(emp.displayNameWithDepartment(dpt), "Michael Sheen Development");
verify(dpt);
reset(dpt); //resetting the mock object back to the recording mode
expect(dpt.getName()).andReturn("Development");
replay(dpt);
assertEquals(emp.displayNameWithDepartment(dpt), "Michael Sheen Development");
verify(dpt);
Nice mocks and Strict mocks
You may have observed we used createStrictMock() to create the Mock objects. There are two other ways to create mock objects.
  • Nice mock
  • Default mock object
All these mocking strategies basically differ in two ways

Optionality
Nice mock allows you to omit expected method calls. If a method is called, but no expectation has been set, then the nice mock simply returns the default value for the type, if the invoked method returns a primitive, or null for an object.
For example, if we change our DepartmentImpl to look like this
public class DepartmentImpl implements IDepartment{
private String name = null;
private String HOD = null;
public String getName() 
{
return name;
}

public String getHODName() 
{
return HOD;
}
}
and change the testWithMockObjects to following
public void testWithMockObjects() throws Exception
{
IDepartment dpt = createNiceMock(IDepartment.class);
replay(dpt);
Employee emp = new Employee(“Michael”, “Sheen”);
assert(emp.displayNameWithDepartment(dpt), “Michael Sheen”)
verify(request);
}
Ordering
Expected invocations on strict mocks need to be specified in the correct order, that is, in the same order that they are executed. In the case of default and nice mocks its not mandatory.

Stubs
Strict mocks are great for defining rigorous tests, but at times applying them can lead to overkill. For example our mock objects contain a bunch of methods, with only some of these of interest. So how can we stop our tests from failing as a result of unexpected behaviour of these "other" methods? This is where Stubs are used.
Consider the code snippet below.
expect(dpt.getName()).andStubReturn("Development"); 
replay(dpt);
Employee emp = new Employee("Michael", "Sheen");
assertEquals(emp.displayNameWithDepartment(dpt), "Michael Sheen A");
...
...
...
...
verify(dpt);
The first line says, if dpt.getName(...) is called one or more times, then each time simply return the String "Development". However, if the method is not called, then don't throw an error. This gives us a lot of flexibility in stubbing out interaction with the mock objects which are irrelevant to the test in consideration.

Summary
Mocking is a powerful technique for helping to obtain high levels of test coverage for our code without worrying much about resolving the associated dependencies. It allows us to specify the behaviour of objects collaborating with our classes under test with a great deal of ease and with a lot more control.
The aim of this article is provide a brief overview of Mocking and overcome the hurdles faced in putting EasyMock to work in their applications.

If you find any problem in the code, or disagree with anything I have mentioned please write to me at ravinder.rawat@gmail.com. You might help me in becoming a more learned person.
 
Technology