Step 1: Have the relevant dependencies required to write unit tests.
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.8.5</version>
<scope>test</scope>
</dependency>
Step 2: The class that is being unit tested. The PersonMapper.java
package com.mycompany.app5;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.camel.Exchange;
import org.springframework.stereotype.Component;
@Component("personMapper")
public class PersonMapper
{
private static final String HEADER_STATUS = "status";
private static final String HEADER_DEST_FILE_SUFFIX = "dest_file_suffix";
enum Status
{
accepted, rejected
};
public Object service(List<List<String>> data, Exchange exchange)
{
List<Map<String, String>> results = new ArrayList<Map<String, String>>();
Map<String, String> headerLine = new LinkedHashMap<String, String>();
headerLine.put("surname", "surname");
headerLine.put("firstname", "firstname");
headerLine.put("age", "age");
results.add(headerLine);
boolean accepted = true;
for (List<String> line : data)
{
Map<String, String> resultLine = new LinkedHashMap<String, String>();
resultLine.put("surname", line.get(1));
resultLine.put("firstname", line.get(0));
resultLine.put("age", line.get(2));
results.add(resultLine);
if (line.get(1) == null || line.get(2) == null)
{
accepted = false;
}
}
if (accepted)
{
exchange.getIn().setHeader(HEADER_STATUS, Status.accepted.name());
}
else
{
exchange.getIn().setHeader(HEADER_STATUS, Status.rejected.name());
}
String srcFileName = (String) exchange.getIn().getHeader("CamelFileNameOnly");
exchange.getIn().setHeader(HEADER_DEST_FILE_SUFFIX, srcFileName);
return results;
}
}
Step 3: The unit test itself with mock objects. The Exchange and Message objects from Apache Camel are mocked using the Mockito framework. Here is the PersonMapperTest class.
package com.mycompany.app5;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import junit.framework.Assert;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
public class PersonMapperTest
{
@Mock
Exchange mockExchange;
@Mock
Message mockMessage;
PersonMapper personMapper;
@Before
public void setup()
{
mockExchange = mock(Exchange.class);
mockMessage = mock(Message.class);
personMapper = new PersonMapper();
when(mockExchange.getIn()).thenReturn(mockMessage);
//invoking a void method
doNothing().when(mockMessage).setHeader(Mockito.anyString(), Mockito.anyString());
//mock return values
when(mockMessage.getHeader("CamelFileNameOnly")).thenReturn("capitalexpenses_20130510.csv");
}
@Test
public void testService()
{
@SuppressWarnings("unchecked")
List<LinkedHashMap<String, String>> result = (List<LinkedHashMap<String, String>>) personMapper.service(
getPersonRecords(), mockExchange);
Assert.assertNotNull(result);
Assert.assertEquals(2, result.size());
LinkedHashMap<String, String> headerRec = result.get(0);
LinkedHashMap<String, String> record = result.get(1);
String headerStr = headerRec.values().toString();
String recordStr = record.values().toString();
Assert.assertEquals(
"[surname, firstname, age]",
headerStr
);
Assert.assertEquals(
"[Smith, John, 35]",
recordStr
);
}
private List<List<String>> getPersonRecords()
{
List<List<String>> values = new ArrayList<List<String>>(5);
List<String> asList = Arrays.asList(new String[]
{
"John", "Smith", "35"
});
values.add(asList);
return values;
}
}