Автоматическое подключение bean-компонента от одного модуля maven к другому модулю maven в рамках одного мультимодульного проекта maven

У меня есть мультимодульный проект Maven с следующим дочерним модулем

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

В Tracker-dao у меня есть spring-context.xml в пакете ресурсов. это сканирует классы 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 для слоя дао работает отлично.

В сервисе Tracker я использовал это ядро ​​Tracker как зависимость. При запуске Junit в Tracker-сервисе происходит ошибка, в которой говорится, что не удалось загрузить контекст приложения, не удалось найти как минимум 1 компонент, соответствующий имени.

весна-сервис-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>

Юнит в Трекер-сервисе

Проблема здесь: @RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (location = { "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());
    }

}

Я также попытался импортировать spring-dao-config из tracker-core в spring-service-config модуля tracker-service. Но в то время, как говорится, файл spring-dao-config.xml не найден.

Пожалуйста, дайте мне знать, что не так и что я пропустил, и предложите решение для этого. Я добавил зависимость для каждого модуля в свой собственный POM.xml, а не все вместе в родительском POM.xml

1 ответ

Я нашел решение своего собственного вопроса. Поправьте меня если я ошибаюсь. Невозможно выполнить тест JUnit, получив доступ к файлу конфигурации из другого модуля maven. JUnit предназначен только для модульного тестирования. а не интеграционное тестирование.

Файл конфигурации зависимых модулей maven не будет доступен в classpath для фактического модуля maven, который вы хотите протестировать. Итак, я скопировал файл конфигурации зависимых модулей maven в путь к классу фактического модуля maven, который мне нужно протестировать. Это не может быть правильным способом сделать это. но я могу успешно выполнить тест JUnit.

Другой способ выполнить тест Junit в этом случае - использовать такие инструменты, как MOCKITO: https://code.google.com/p/mockito/

Другие вопросы по тегам