Spring Junit: проблема с использованием класса @Configurable в модульном тесте - PullRequest
0 голосов
/ 30 марта 2020

Похоже, что при использовании @Configurable (either compile or load time) if you have a class that has @ Autowired context (see aClass. javabelow) from 2 different context ( context1. xml, context2. xml), the @ Configurable` всегда сохраняются внутри предыдущей весны context.

, чтобы проиллюстрировать эту проблему. Я создал эти 3 модульных теста: Test1, Test2, test3.

Если я буду запускать каждый тест по отдельности, я не получу ошибок.

, но если я запускаю 3 теста в наборе, Test3 завершится неудачно с ошибкой "Не определен bean-компонент с именем 'bean1'", но он должен работать так, как настроено в context1. xml

Есть ли способ обойти эту проблему и попросить Spring переназначить классы @configurable в правильном контексте, не помечая тест как грязный?

Я получаю эту проблему в интеграционном тесте пакет, и загрузка этого контекста занимает около 1 минуты, поэтому его загрязнение после каждого теста неприемлемо

springContextTest/context1.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/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:annotation-config />
    <context:component-scan base-package="common.springContextTest"/>
    <context:spring-configured/>
    <context:load-time-weaver />

    <bean id="bean1" class="java.lang.String">
        <constructor-arg type="java.lang.String" value="hello"/>
    </bean>

</beans>

springContextTest/context2.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/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:annotation-config />
    <context:component-scan base-package="common.springContextTest"/>
    <context:spring-configured/>
    <context:load-time-weaver />

    <bean id="bean2" class="java.lang.String">
        <constructor-arg type="java.lang.String" value="hello2"/>
    </bean>

</beans>

springContextTest/AClass.java

package springContextTest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.ApplicationContext;

@Configurable(preConstruction = true)
public class AClass {
    @Autowired
    public ApplicationContext appContext;

    public String getBean(String beanName){
        return (String) appContext.getBean(beanName);
    }
}

springContextTest/Test1.java

package springContextTest;

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"context1.xml"})
public class Test1 {
    @Autowired
    private ApplicationContext appContext;

    @Test
    public void name() {
        AClass aClass = new AClass();
        Assert.assertEquals("hello",aClass.getBean("bean1"));
    }
}

springContextTest/Test2.java

package springContextTest;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"context2.xml"})
public class Test2 {
    @Test
    public void name() {
        AClass aClass = new AClass();
        Assert.assertEquals("hello2",aClass.getBean("bean2"));
    }
}

springContextTest/Test3.java

package springContextTest;

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"context1.xml"})
public class Test3 {
    @Autowired
    public ApplicationContext appContext;

    @Test
    public void name() {
        AClass aClass = new AClass();
        //aClass.appContext =appContext;
        Assert.assertEquals("hello",aClass.getBean("bean1"));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...