Насмешка над файлом свойств с помощью Mockito весной - PullRequest
6 голосов
/ 17 июня 2011

Я пытаюсь написать модульный тест для следующего метода в моем контроллере.

@Autowired
    private ApplicationContext context;

    private String getProperty() {
        try {
            Properties props = context.getBean("myProperties", Properties.class);
            String val = props.getProperty("myProperty");
......

Бин объявлен так в моем applicationContext:

<util:properties id="myProperties" scope="prototype" location="file:${catalina.base}/webapps/myProperties.properties"/>

Как я могу сделать это, чтобы проверить разные значения переменной val?

Я думал о создании файла свойств теста и насмешке над ним следующим образом:

context = Mockito.mock(ApplicationContext.class);
Mocikto.when(context.getBean("myProperties", Properties.class)).thenReturn(some test file)

, но тогда мне нужно было бы где-то объявить файл теста как бин.

Мне было интересно, есть либыл более простой способ сделать это?

Спасибо

Ответы [ 3 ]

5 голосов
/ 17 июня 2011

Если вы используете spring-3, вы можете сделать:

<context:property-placeholder location="myprops.properties" />

И в своем коде:

@Value("${myProperty}")
private String myProp;

public String getMyProp() {
    return myProp;
}

Это делает myprops.properties доступным для переменнойзамены с помощью выражений $ {...}, а аннотация @Value позволяет вводить значения свойств.Затем в своем модульном тесте вы можете просто установить разные значения myProp.

1 голос
/ 21 июня 2011

Таким образом, я могу тестировать без загрузки контекста Spring. Я использую класс Config для доступа ко всем значениям файла свойств из кода.Преимущества:

1) Spring не загружается в ваших юнит-тестах

2) Вы можете вызвать исключение, если свойство отсутствует и требуется

3) Вы можете вернуть значения свойств строго типа из методов getter () (т.е. преобразовать в Date)

4) Значения «ключа», ожидаемые от файлов свойств, задокументированы в одном классе Java (т. Е. Public staticfinal PROP_XXX)

@Component
public class Config {

public static final String PROP_USER_NAME = "user.name";

private Properties applicationProperties;


/*** Functional methods ***/

/**
 * Helper method to ensure consistent Exception handling where requested property values are missing
 * from the properties files and they are "required" for the application to function correctly.
 *
 * @param key
 * @return The String value of the property requested
 */
private String readPropertyRequired(String key) {

    String value = readProperty(key);

    if(StringUtils.isBlank(value))  {
        throw new PropertyNotFoundException(key);
    }

    return value;
}

/**
 * Helper method to return String values from the properties files that have been loaded
 *
 * @param key
 * @return The String value of the property requested or NULL if empty
 */
private String readProperty(String key) {
    return applicationProperties.getProperty(key);
}


/*** Getters & Setters ***/

@Autowired
public void setApplicationProperties(Properties applicationProperties) {
    this.applicationProperties = applicationProperties;
}

public String getUserName() {
    return readPropertyRequired(PROP_USER_NAME);
}

}

Затем вы можете выполнить модульное тестирование этого класса, просто вставив стандартный java.util.Properties

1 голос
/ 17 июня 2011

Более простой способ - использовать org.springframework.beans.factory.config.PropertyPlaceholderConfigurer вместо явного извлечения свойств из контекста приложения Spring.PropertyPlaceholderConfigurer внедряет ваш компонент с указанными вами свойствами.Тогда вам вообще не нужен Mockito, в тесте вы устанавливаете значение свойства в Controller равным тому, что вы хотите.

Таким образом, вы настраиваете конфигуратор в контексте приложения xml:

<context:property-placeholder 
  location="file:${catalina.base}/webapps/myProperties.properties"/>

и добавьте некоторую конфигурацию для вашего контроллера (я ожидаю, что есть способ сделать это с аннотациями, но не знаю):

 <bean id="whateverMyControllerIdIs" class="com.initech.foobar.MyControllerImpl">
   <property name="quux"><value>${myProperty}</value></property>
 </bean>

, где у контроллера есть переменная экземпляракоторый вы хотите заполнить свойством, с помощью установщика, например:

String quux;

public void setQuux(String quux) {this.quux = quux;}

Только что увидел сообщение в блоге об улучшениях в Spring 3.1 , вот новый бесплатный способ xml сделатьэто:

    @Configuration
@PropertySource("classpath:/com/myco/app.properties")
public class AppConfig {
    @Autowired
    Environment env;

    @Bean
    public TestBean testBean() {
        TestBean testBean = new TestBean();
        testBean.setName(env.getProperty("testbean.name"));
        return testBean;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...