Тестирование с aeonbits владельца java - PullRequest
0 голосов
/ 05 сентября 2018

Я использую java OWNER для настройки свойств.

Я создал статический метод

public static final ApplicationConfiguration config = ConfigFactory.create(ApplicationConfiguration.class,
        System.getProperties(), System.getenv());

и я импортирую класс везде, где мне нужно.

Излишне говорить, что модульное тестирование - это PITA. Я не смог найти хороший способ переопределить значения в конфигурации.

Я бы хотел избежать передачи конфигурации как зависимости в каждом классе. Это добавляет много подробностей и не имеет смысла с точки зрения дизайна. То же самое касается вызова фабрики конфигурации в каждом классе

ApplicationConfiguration config = ConfigFactory.create(ApplicationConfiguration.class,
        System.getProperties(), System.getenv());

У вас есть предложения? есть ли лучшая практика?

1 Ответ

0 голосов
/ 11 сентября 2018

Две вещи:

  1. Вы можете создать класс, который предоставляет свойства, и все пользователи используют его:

    public class PropertiesAccessor {
    
       private static MyConfiguration mMyConfig = ConfigFactory.create(MyConfiguration.class);
    
       private PropertiesAccessor() 
          // No need to allow instantiation of this class
       }
    
       /**
        * Get properties for this application
        *
        * @return Properties
        */
       public static MyConfiguration getProperties() {
          return mMyConfig;
       }
    
       // for unit testing
       @VisibleForTesting
       public static void setProperties(MyConfiguration config) {
          mMyConfig = config;
       }
    }
    

    Теперь везде, где вам нужно свойство, вы можете использовать этот статический метод

    PropertiesAccessor.getProperties()
    
  2. Обратите внимание, что существует метод для тестирования setProperties (). Есть разные способы использовать этот метод. Вы можете создать тестовый файл свойств, загрузить его, а затем вызвать метод setProperties (). Мне нравится иметь такой служебный метод:

    public static void initProperties(String fileName) {    
    
       Properties testProperties = new Properties();    
    
       File file = new File(fileName);
       FileInputStream stream = null;   
       try {    
          stream = new FileInputStream(file);   
          testProperties.load(stream);  
       } catch (IOException e) {    
          // Log or whatever you want to do
       } finally {  
          if (stream != null) {
          try { 
             stream.close();    
       } catch (IOException e) {    
         // Log or whatever you want to do; 
       }    
    
       MyConfiguration config = ConfigFactory.create(MyConfiguration.class, testProperties);    
       PropertiesAccessor.setProperties(config);
    }
    

    Тогда вы можете иметь различные файлы свойств.

    Или, если вы просто хотите установить несколько свойств, сделайте следующее:

     Properties testProperties = new Properties();
     testProperties.setProperty("key1", "data1");
     testProperties.setProperty("key2", "data2");
     final MyConfiguration myConfig = ConfigFactory.create(MyConfiguration.class, testProperties);
     PropertiesAccessor.setProperties(myConfig);
    
...