Showing posts with label maven. Show all posts
Showing posts with label maven. Show all posts

Tuesday, 18 March 2014

How to put your code under test with Maven, Spring and Junit

So i worked a lot with maven, spring and junit, and on every project i faced the need to have my code under test and so i do each time. an i thought why not have a simple how to do so and so i do this post :D.

so let see what you need to have your own maven project running

  1. JDK 1.6+.
  2. Maven.
  3. IDE or any text editor.
so my pom.xml looks like

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.shereifhawary.spring</groupId>
<artifactId>testing</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<spring.version>3.0.5.RELEASE</spring.version>
</properties>
<dependencies>
<!-- Spring 3 dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- testing dependencies -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>

</dependencies>
</project>

and i have a simple model and simple service that use this model

as

package com.shereifhawary.spring;
public class SimpleModel {
private String value = "some value";
public String getValue(){
return this.value;
}
public void setValue(String value) {
this.value = value;
}
}

package com.shereifhawary.spring;
public class SimpleService {
private SimpleModel model;
public SimpleModel getModel() {
return model;
}
public void setModel(SimpleModel model) {
this.model = model;
}
public String getValue(){
return model.getValue();
}
}

inside the src/test/resources/beans.xml which carry the bean definition

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

         <bean id="simpleModel" class="com.shereifhawary.spring.SimpleModel">
             <property name="value" value="some value from Spring config"/>
         </bean>
 
<bean id="simpleService" class="com.shereifhawary.spring.SimpleService">
   <property name="model" ref="simpleModel"/>
</bean>
</beans>


and the test case should be like

package com.shereifhawary.spring.tests;
import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.shereifhawary.spring.SimpleService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/beans.xml" })
public class TestSpringContext {
         
         // the autowire will set the simpleSerice object with the one in the bean.xml
         // so you can use it inside the testcase without even using setup function
@Autowired
SimpleService simpleService;
@Test
public void testSimpleService(){
                // as you can see we set the value with "some value" in the class itself,
                // but inside the bean.xml we set it with "some value from Spring config
"
assertNotEquals("some value",simpleService.getValue());
assertEquals("some value from Spring config
",simpleService.getValue());
}
}

i hope you like it, if you have any questions please leave it below ;)