0

I have a multi module maven project with follwing child module

Tracker
|--Tracker-core
|--Tracker-dao
|  |---src/main/resource/spring-dao-config.xml
|
|--Tracker-services
|  |---src/main/resource/spring-service-config.xml
|
|--Tracker-web

In Tracker-dao, I have a spring-context.xml in the resource package. this scans for the dao classes and includes other datasource configuration.

spring-dao-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <context:component-scan base-package="com.gits.tracker"></context:component-scan>

    <bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:/database.properties" />
    </bean>

    <import resource="classpath:hibernate-config.xml" />

    <!-- Declare a datasource that has pooling capabilities -->

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>


    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <!-- An AnnotationSessionFactoryBean for loading Hibernate mappings from 
        annotated domain classes. -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.gits.tracker.core.entity.Address</value>
                <value>com.gits.tracker.core.entity.Company</value>
                <value>com.gits.tracker.core.entity.Customer</value>
                <value>com.gits.tracker.core.entity.User</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <!-- <prop key="hibernate.query.factory_class">org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory</prop> -->
            </props>
        </property>
    </bean>    

</beans>

Junit test for the dao layer alone is working perfectly alright.

In the Tracker-service, I have used this Tracker-core as a dependency. While running the Junit in Tracker-service, it goes error, saying failed to load Application context, failed to find atleast 1 bean matching the name.

spring-service-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <!-- <import resource="classpath:spring-dao-config.xml"/> -->
    <context:component-scan base-package="com.gits.tracker.service.services"></context:component-scan>
</beans>

Junit in Tracker-service

Problem is here: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:spring-service-config.xml" })

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring-service-config.xml" })
public class TestUserService extends
        AbstractTransactionalJUnit4SpringContextTests {

    private static Logger logger;
    private static ApplicationContext ctx;
    private UserService userService;

    @BeforeClass
    public static void init() {
        logger = Logger.getLogger(User.class);
        if (logger.isDebugEnabled()) {
            logger.debug("IN DEBUG MODE");
        }
    }

    @Before
    public void localInit() {
        logger.info("*************EXECUTING LOCALINIT*************");
        ctx = new FileSystemXmlApplicationContext(
                "src/main/resources/spring-config.xml");
        userService = (UserService) ctx.getBean("userServiceImpl");

        // userDao.executeQuery("delete from User where id<>3");
        logger.info("*************DELETED ALL COMPANY FROM TABLE*************");
        logger.info("*************EXITING OUT OF LOCALINIT*************");
    }

    @AfterClass
    public static void stop() {
        logger.debug("TEST COMPLETED");
    }

    private UserServiceImpl loadUserService() {
        return (UserServiceImpl) ctx.getBean("userServiceImpl");
    }

    private UserDTO createTestUserDTO() {
        UserDTO dto = new UserDTO("manoj", "manojpass", "true");
        return dto;
    }

    @Test
    public void testCreateUser() {
        loadUserService();
        UserDTO dto = createTestUserDTO();
        Long id = userService.createUser(dto);
        dto.setId(id);
        UserDTO dto_1 = userService.getUserById(id);
        org.junit.Assert.assertEquals(dto.toString(), dto_1.toString());
    }    


    @Test
    public void findByCriteriaWithAlias() {
        loadUserService();
        UserDTO dto = createTestUserDTO();
        Long id = userService.createUser(dto);
        CriteriaWithAlias criteriaWithAlias = new CriteriaWithAlias();
        HashMap<String, String> alias = new HashMap<String, String>();
        List<Criterion> criterions = new ArrayList<Criterion>();
        Criterion criterion0 = Restrictions.eq("username", dto.getUsername());
        criterions.add(criterion0);
        criteriaWithAlias.setAlias(alias);
        criteriaWithAlias.setCriterions(criterions);

List<UserDTO> users = userService
                .findByCriteriaWithAlias(criteriaWithAlias);
for (UserDTO user : users) {
org.junit.Assert.assertFalse(user.getPassword().isEmpty());
org.junit.Assert.assertFalse(user.getId().toString().isEmpty());
org.junit.Assert.assertFalse(user.getUsername().isEmpty());
org.junit.Assert.assertFalse(user.getEnabled().isEmpty());
}
}

    @Test
    public void findByProjection() {
            loadUserService();
    UserDTO dto = createTestUserDTO();
    userService.createUser(dto);
    CriteriaWithAlias criteriaWithAlias = new CriteriaWithAlias();
    HashMap<String, String> alias = new HashMap<String, String>();
    HashMap<String, String> projections = new HashMap<String, String>();
    List<Criterion> criterions = new ArrayList<Criterion>();
    projections.put("username", "username");
    projections.put("enabled", "enabled");
    Criterion criterion0 = Restrictions.ne("username", "syed");
    Criterion criterion1 = Restrictions.eq("enabled", "true");
    criterions.add(criterion0);
    criterions.add(criterion1);
    criteriaWithAlias.setAlias(alias);
    criteriaWithAlias.setCriterions(criterions);
    criteriaWithAlias.setProjections(projections);

    List<UserDTO> users = userService
            .findByCriterionWithProjection(criteriaWithAlias);
    for (UserDTO user : users) {
        org.junit.Assert.assertNull(user.getPassword());
        org.junit.Assert.assertNull(user.getId());
        org.junit.Assert.assertFalse(user.getUsername().isEmpty());
        org.junit.Assert.assertFalse(user.getEnabled().isEmpty());
    }

}

I also tried importing the spring-dao-config of tracker-core in spring-service-config of the tracker-service module. But, that time, it says, spring-dao-config.xml file not found.

Please let me know whats wrong and what I have missed and suggest a solution for this. I have added the dependency for each module in their own POM.xml and not all together in parent POM.xml

amFroz
  • 95
  • 1
  • 12

1 Answers1

0

I found solution to my own question. Correct me if I'm wrong. Its not possible to perform a JUnit test by accessing a config file from another maven module. JUnit is meant for Unit testing only. and not the integration testing.

The dependent maven modules config file will not be available in the classpath for the actual maven module you want to test. So, what I did was, copied the config file of the dependent maven modules into the classpath of the actual maven module which I need to test. This might not be the correct way of doing it. but, I'm able to perform the JUnit test successfully.

Other way to perform Junit test in such case is to use tools like MOCKITO : https://code.google.com/p/mockito/

amFroz
  • 95
  • 1
  • 12
  • Ahh! I can confirm that this is an issue (having just spent a few hours struggling with this myself). This question has additional information about the problem and how to overcome it: http://stackoverflow.com/questions/14946298/spring-junit-load-application-context-for-tests – Peter Kirby May 09 '14 at 18:59