You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 58 Next »

${renderedContent}

Quick Links to:

New CSF AbstractIntegrationTestBase.java unit test base class

This new CSF abstract class is to be used with all unit tests.  It replaces the following deprecated classes

  • BaseTransactionalIntegrationTest
  • AbstractTransactionalDataSourceSpringContextTests

that were used in csf-common-legacy.

About the AbstractIntegrationTestBase base class

Below is a complete listing of the AbstractIntergrationTestBase class.  Of particular interest is the usage of the @Transactional and the @ContextConfiguration annotations.

It is important that you read and understand the class comments regarding the @Transactional annotation.  It is reproduced here for emphasis.

 * The class is marked as @Transactional, which means test methods in derived
 * classes will be run in a transaction and will be automatically rolled back on
 * completion. If you do not want transactional behavior in a test method,
 * annotate the method with @NotTransactional. If you do not want the automatic
 * rollback, annotate the method with @Rollback(false). BUT - normally our
 * "integration" tests should use a transaction and do rollback, so the defaults
 * should always be what you want.

The locations element of the @ContextConfiguration only specifies one xml file.  This xml file is used to set the default test application context for ALL unit tests which extends AbstractIntegrationTestBase.java class.  At the bottom of this page is more information on how to configure and how to override the default test application context.

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author sturner AbstractIntegrationTestBase
 *
 * Based on the old BaseTransactionalIntegrationTest class: refactored to move
 * away from deprecated Spring classes and to the newer Spring TestContext
 * Framework.
 *
 * NOTE - this is now an abstract class. This does not change the usage, as the
 * old version of the class was only ever used as a base class for JUnit
 * classes.
 *
 * The list of context config locations can be overriden by coding
 * @ContextConfiguration in a base class.
 *
 * The class is marked as @Transactional, which means test methods in derived
 * classes will be run in a transaction and will be automatically rolled back on
 * completion. If you do not want transactional behavior in a test method,
 * annotate the method with @NotTransactional. If you do not want the automatic
 * rollback, annotate the method with @Rollback(false). BUT - normally our
 * "integration" tests should use a transaction and do rollback, so the defaults
 * should always be what you want.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext-csf-unit-tests-default.xml"})
@TestExecutionListeners({TransactionalTestExecutionListener.class, DependencyInjectionTestExecutionListener.class})
@Transactional
public abstract class AbstractIntegrationTestBase {

    public AbstractIntegrationTestBase() {
        super();
    }
}

Usage of the AbstractIntegrationTestBase base class

  1. The following code fragment illustrates how to use AbstractIntegrationTestBase class
    import edu.mit.csf.test.AbstractIntegrationTestBase;
    
    public class TestHibernateAcademicTermDao extends AbstractIntegrationTestBase {
    
    }
    

  2. Add the following dependencies to your project's pom.xml.
            <dependency>
                <groupId>edu.mit.ist.es.csf</groupId>
                <artifactId>csf-test</artifactId>
                <version>[0.0.0,999.999.999)</version>
                <type>test-jar</type>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>edu.mit.ist.es.csf</groupId>
                <artifactId>csf-test</artifactId>
                <version>[0.0.0,999.999.999)</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.10</version>
            </dependency>
    

How to configuration the default test application context

The annotation

@ContextConfiguration(locations = {"classpath:applicationContext-csf-unit-tests-default.xml"})

is used to set the default test application context for all the junit tests which extend the AbstractIntegrationTestBase .java class.

If the project was created using the es-project-template (for either the jar or war) then the applicationContext-csf-unit-tests-default.xml file can be found it the project's src/test/resources directory.

If the project was NOT created using the es-project-template, then the applicationContext-csf-unit-tests-default.xml must be created in the project's src/test/resources directory.  To download the a starter version of the applicationContext-csf-unit-tests-default.xml file, right click on this link and select Save target as....  Be sure to save the file in the project's src/test/resources directory.

The following is a listing of the starter version of the applicationContext-csf-unit-tests-default.xml file:

<?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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc-xsd
           http://www.springframework.org/schema/util
           http://www.springframework.org/schema/util/spring-util.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx.xsd">
           
    <import resource="classpath*:applicationContext-csf-common-config-test.xml" />
    <import resource="classpath*:applicationContext-csf-common.xml" />
    <import resource="classpath*:applicationContext-csf-webservices.xml" />
    <import resource="classpath*:applicationContext-csf-security-spring.xml" />
    <import resource="classpath*:applicationContext-csf-workflow.xml" />
    <import resource="classpath*:applicationContext-csf-email.xml" />
    <import resource="classpath*:applicationContext-csf-common-test.xml" />
 </beans>

Notice that the starter version of the applicationContext-csf-unit-tests-default.xml only contains imports of the CSF application context files.  This starter xml file must now be customized with your project's application context xml files.

The following is an example from the Student Sponsored Billing application and is an example on how to customize the applicationContext-csf-unit-tests-default.xml file.

<?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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc-xsd
           http://www.springframework.org/schema/util
           http://www.springframework.org/schema/util/spring-util.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx.xsd">
           
    <import resource="classpath*:applicationContext-csf-webservices.xml" />
    <import resource="classpath*:applicationContext-csf-security-spring.xml" />
    <import resource="classpath*:applicationContext-csf-common.xml" />
    <import resource="classpath*:applicationContext-csf-email.xml" />
    <import resource="classpath*:applicationContext-csf-studentaccount.xml" />
    <import resource="classpath*:applicationContext-csf-ssb.xml" />
    <import resource="classpath*:applicationContext-ssb.xml" />
    <import resource="classpath*:applicationContext-config-test.xml" />
</beans>

The order in which the xml files appear is important.  Just remember the beans are instantiated in the order that they are processed and, if needed, overriding previous bean instantiations with identical ids.

How to override for the default test application context

The following code fragment illustrates how to override the default test application conxtext:

import org.springframework.test.context.ContextConfiguration;
import edu.mit.csf.test.AbstractIntegrationTestBase;

@ContextConfiguration(locations = {"classpath:applicationContext-special-authorization-test.xml"})
public class TestHibernateAcademicTermDao extends AbstractIntegrationTestBase {

}

This applicationContext-special-authorization-test.xml must also exist in the project's src/test/resources directory.  This xml file will contain a list of imports of application context xml files.  For example, the contents of this xml file might look like:

<?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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc-xsd
           http://www.springframework.org/schema/util
           http://www.springframework.org/schema/util/spring-util.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx.xsd">
           
    <import resource="classpath*:applicationContext-special-setup.xml" />
    <import resource="classpath*:applicationContext-csf-webservices.xml" />
    <import resource="classpath*:applicationContext-csf-common.xml" />
    <import resource="classpath*:applicationContext-special-authorizations.xml" />
    <import resource="classpath*:applicationContext-general-config-test.xml" />
</beans>
  • No labels