Тестирование компонентов Spring с использованием нескольких ApplicationContexts - PullRequest
2 голосов
/ 28 марта 2012

У меня есть тестовый код, который тестирует некоторый код для вставки элементов в журнал событий Windows.

package applicationmonitoring.notify;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import applicationmonitoring.core.Alert;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ={"classpath:applicationmonitoring/notify/*.xml"})
public class WinEventLogNotifierTest {

    @Autowired
    protected WinEventLogNotifier winEventLogNotifier;

    @Autowired
    protected Alert alert;

    @org.junit.Before
    public void setUp() throws Exception {

    }

    @org.junit.After
    public void tearDown() throws Exception {

    }

    @Test
    public void testNotify() throws Exception {
        winEventLogNotifier.notify(alert);
    }
}

У меня также есть несколько ApplicationContexts, которые имеют форму. Идентификаторы были изменены для каждого файла

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

    <!-- Calypso notifier -->
    <bean id="winInfoEventAlertNotifier" class="applicationmonitoring.notify.WinEventLogNotifier" >
        <constructor-arg index="0">
            <value>Windows Event alert notifier</value>
        </constructor-arg>
        <constructor-arg index="1">
            <map>
                <!-- Valid Logging Levels and Precendences are -->
                <!-- DEBUG < INFO < WARN < ERROR < FATAL -->
                <entry key="loggingLevel" value="INFO"/>
                <entry key="patternLayout" value="%-4r [%t] %-5p %c %x - %m%n"/>
            </map>
        </constructor-arg>
        <constructor-arg index="2">
            <map>
                <entry key="60" value="20"/>
                <entry key="3600" value="50"/>
                <entry key="14400" value="100"/>
            </map>
        </constructor-arg>
    </bean>

    <bean id="infoAlert" class="applicationmonitoring.core.Alert">

        <constructor-arg index="0" value="INFO"/>
        <constructor-arg index="1" value="infoAlert message"/>
        <constructor-arg index="2" value="infoAlert source"/>
        <constructor-arg index="3" value="infoAlert subject"/>
        <constructor-arg index="4" ref="defaultDate"/>
        <constructor-arg index="5" ref="defaultException"/>
    </bean>

    <bean id="defaultDate" class="java.util.Date" scope="prototype"/>
    <bean id="defaultException" class="java.lang.Exception">
        <constructor-arg index="0" value="Test Exception"/>
    </bean>

</beans>

Мне бы хотелось иметь другой ApplicationContext для проверки каждого отдельного уровня logLevel.

Однако, когда я запускаю команду

mvn test

когда верный огонь настроен как

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12</version>
            </plugin>
        </plugins>
    </build>

Я получаю следующее

Tests in error: 
  testNotify(applicationmonitoring.notify.WinEventLogNotifierTest): Error creating bean with name 'applicationmonitoring.notify.WinEventLogNotifierTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected applicationmonitoring.notify.WinEventLogNotifier applicationmonitoring.notify.WinEventLogNotifierTest.winEventLogNotifier; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [applicationmonitoring.notify.WinEventLogNotifier] is defined: expected single matching bean but found 2: [winInfoEventAlertNotifier, winWarnEventAlertNotifier]

Как заставить тест выполняться для каждого ApplicationContext изолированно? Это правильный подход? Ссылаясь на эту статью http://bmocanu.ro/coding/399/unit-testing-with-spring-a-bad-mix/ следует ли использовать Spring в тестовой ситуации только для интеграционного тестирования?

1 Ответ

0 голосов
/ 28 марта 2012

Одна возможность указать точное имя файла контекста для каждого теста в строке ниже вместо подстановочного знака.

@ContextConfiguration(locations ={"classpath:applicationmonitoring/notify/*.xml"})
...