Почему getResourceAsStream (sConfigFile) возвращает null, когда проект запускался из Main? - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть такой код в моем проекте:

public static final String LANGUAGE = Props.get("abc.language");

он использует это class Props в библиотеке только для чтения:

public class Props {

    private static Props instance;
    private static Properties properties;

    private Props() {
        initProperties();
    }

    /**
     * Get property from file
     */
    public static String get(String prop) {
        return getInstance().getProp(prop);
    }

    public static synchronized Props getInstance() {
        if (instance == null) {
            instance = new Props();
        }
        return instance;
    }

    // this method fails when the project starts from the main
    private static void initProperties() {
        String sConfigFile = System.getProperty("TagConfigFile", "config/application.properties");
        properties = new Properties();
        //streamFromResources gets null in the next line, if project was run from main
        try (InputStream streamFromResources = Props.class.getClassLoader().getResourceAsStream(sConfigFile)) {
            InputStreamReader isr = new InputStreamReader(streamFromResources, "UTF-8");
            properties.load(isr);
        } catch (IOException | NullPointerException e) {
            throw new PropsRuntimeException("Failed to access properties file", e);
        }
    }

    /**
     * Returns the value of the property 'name' of empty string if the property is not found
     */
    private String getProp(String name) {
        String val = getProps().getProperty(name, "");
        return val.trim();
    }
}

Когда я запускаю проект из Cucumber. java, он успешно запускается.

Когда я пытаюсь запустить проект с помощью main, он завершается неудачей, поскольку streamFromResources получает значение NULL в строке InputStream streamFromResources = Props.class.getClassLoader().getResourceAsStream(sConfigFile) (метод initProperties()). Моя трудность заключается в том, что я не могу изменить class Props.

Ниже приведен код классов RunnerTest и Cucumber

мой класс RunnerTest:

public class RunnerTest {

    private static String[] defaultOptions = {
            "--glue", "ru.abc.stepDefs",
            "--glue", "ru.abc.d.stepdefs",
            "src/test/resources/"
    };

    public static void main(String[] args) throws Throwable {
        Stream<String> cucumberOptions = Stream.concat(Stream.of(defaultOptions), Stream.of(args));
        cucumber.api.cli.Main.main(cucumberOptions.toArray(String[]::new));
    }

мой класс CucumberTest:

@RunWith(Cucumber.class)
@CucumberOptions(
        monochrome = true,
        glue = {"ru.abc.stepDefs", "ru.abc.d.stepdefs"},
        features = {"src/test/resources/features/"},
        tags = {"@TEST2"},
        plugin = {"pretty", "html:target/cucumber-html-report"}
)
public class CucumberTest {}

Структура моего проекта:

abc
 |
 |---src
 |    |
 |    |---- main
 |    |      |
 |    |      |---- java
 |    |      |      |
 |    |      |      |----  SteDefinition.java
 |    |      |      |      Page1.java
 |    |      |      |      Models.java
 |    |      |      |      RunnerTest.java
 |    |      |      |      CucumberTest.java
 |    |
 |    |
 |    |---- test
 |    |       |
 |    |     resources
 |    |       |
 |    |       |---- config
 |    |       |       |
 |    |       |       |---- application.properties
 |    |       |
 |    |       |---- features
 |    |       |       |
 |    |       |       |---- smoke1.feature
 |    |       |       |     smoke2.feature
 |    |       |
 |    |       |---- testdata
 |    |       |       |
 |    |       |       |---- objects
 |    |       |       |        |
 |    |       |       |        |---- defaultTestDataDEV.json
...