2015-10-06 4 views
9

У меня есть тест jUnit, который имеет свой собственный файл свойств (application-test.properties) и его конфигурационный файл Spring (application-core-test.xml).Spring jUnit Файл свойств тестирования

В одном из методов используется объект, созданный с помощью пружинной конфигурации, и который является пружинным компонентом. Один из членов в классах получает свою ценность из application.properties, который является нашим основным файлом свойств. При доступе к этому значению через jUnit он всегда равен нулю. Я даже попытался изменить файл свойств, чтобы указать на фактический файл свойств, но это, похоже, не работает.

Вот как я доступ к свойствам файла объекта

@Component 
@PropertySource("classpath:application.properties") 
public abstract class A { 

    @Value("${test.value}") 
    public String value; 

    public A(){ 
     SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 
    } 

    public A(String text) { 
     this(); 
     // do something with text and value.. here is where I run into NPE 
    } 

} 

public class B extends A { 
    //addtnl code 

    private B() { 

    } 


    private B(String text) { 
     super(text) 
    } 
} 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:META-INF/spring/application-core-test.xml", 
          "classpath:META-INF/spring/application-schedule-test.xml"}) 
@PropertySource("classpath:application-test.properties") 
public class TestD { 

@Value("${value.works}") 
public String valueWorks; 

@Test 
public void testBlah() { 
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 
    B b= new B("blah"); 
    //...addtnl code 

} 

}

+0

Как вы создаете экземпляр 'A'? Я предполагаю, что вы используете 'new', а не просматриваете его из ApplicationContext. –

+0

. Не следует ли application.properties в @PropertySource читать application-test.properties? –

+0

@Lance Java: Да, я использую новый. Попробуем посмотреть из ApplicationContext. – user1707141

ответ

22

Во-первых, application.properties в @PropertySource следует читать application-test.properties, если это то, что файл с именем (соответствие эти вещи вопросы):

@PropertySource("classpath:application-test.properties ") 

Этот файл должен быть под вашим /src/test/resources классам (в корне).

Я не понимаю, почему вы указали зависимость, жестко закодированную в файл application-test.properties. Этот компонент используется только в тестовой среде?

Нормальная вещь - иметь файлы свойств с тем же именем в разных классах. Вы загружаете тот или иной файл в зависимости от того, выполняете ли вы свои тесты или нет.

В типичном выложенной заявке, вы должны:

src/test/resources/application.properties 

и

src/main/resources/application.properties 

А затем вводят его так:

@PropertySource("classpath:application.properties") 

Равномерное лучше вещь do будет представлять этот файл свойств как компонент в вашем весеннем контексте, а затем вводить этот компонент в любой компонент, который нуждается в этом. Таким образом, ваш код не усеян ссылками на application.properties, и вы можете использовать все, что хотите, в качестве источника свойств. Вот пример: how to read properties file in spring project?

+0

. Я внесли предлагаемые изменения, но он по-прежнему не загружает значение из файла свойств ... есть ли что-то, что мне не хватает – user1707141

+0

Установлены ли ваши классы? Как вы это используете? –

+0

Да, установлены классы классов. В приведенном выше коде в классе D упоминается, как он настроен. Я использую eclipse, и я запускаю как -> jUnit test – user1707141

8

Что касается тестирования, то следует использовать с Spring 4.1, который перепишет свойства, определенные в других местах:

@TestPropertySource("classpath:application-test.properties") 

Тестовые источники собственности имеют более высокий приоритет, чем загружаются из операционной системы свойства среды или Java, а также источники свойств, добавленные приложением, например @PropertySource