在 Java Azure 函数应用程序单元测试中加载 local.settings.json 属性的正确方法是什么?

What is the proper way to load local.settings.json properties in a Java Azure function app unit test?

在 Java Azure 函数应用程序单元测试中加载 local.settings.json 属性的正确方法是什么?

当我 运行 单元测试时,测试不会自动获取设置文件配置,就像我直接 运行 函数应用程序时那样。

我是这样做的,但我担心这是一个黑客?我找不到有关如何执行此操作的文档。据我所知,Java SDK 中已有一个 class 已经知道如何处理这个?

public class ConfigurationClientProvider {

    private static final String CONNECTION_STRING = "APP_CONFIGURATION_CONNECTION_STRING";

    private static final String LOCAL_SETTINGS_FILE = "local.settings.json";

    public ConfigurationClient createConfigurationClient() {
        return new ConfigurationClientBuilder()
                .connectionString(getConnectionString())
                .buildClient();
    }

    public String getConnectionString() {
        Optional<String> optionalConnectionString = Optional.ofNullable(System.getenv(CONNECTION_STRING));
        return optionalConnectionString.orElse(readPropertyFromLocalConfig(CONNECTION_STRING, "Values"));
    }

    public String readPropertyFromLocalConfig(String propertyName, String parentKey) {
        try (FileInputStream fis = new FileInputStream("local.settings.json")) {
            String data = IOUtils.toString(fis, "UTF-8");
            try {
                JSONObject jsonObject = new JSONObject(data);
                return (String)((JSONObject)jsonObject.get(parentKey)).get(propertyName);
            } catch (JSONException err){
                log.error("Error reading file: " + LOCAL_SETTINGS_FILE, err.toString());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return StringUtil.EMPTY_STRING;
    }

}

下面是我如何实现 readPropertyFromLocalConfig 方法:

@Slf4j
public class ConfigurationClientProvider {
    private static final String CONNECTION_STRING = "APP_CONFIGURATION_CONNECTION_STRING";
    private static final String LOCAL_SETTINGS_FILE = "local.settings.json";
    private static final String ENV_SETTINGS_KEY = "Values";
    private static final String ENCODING = "UTF-8";

    public ConfigurationClient createConfigurationClient() {
        return new ConfigurationClientBuilder()
                .connectionString(getConnectionString())
                .buildClient();
    }

    public String getConnectionString() {
        return getProperty(CONNECTION_STRING, ENV_SETTINGS_KEY);
    }

    public String getProperty(String propertyName, String parentKey) {
        Optional<String> optionalParentKey = Optional.ofNullable(parentKey);
        Optional<String> optionalConnectionString = Optional.ofNullable(System.getenv(propertyName));
        return optionalConnectionString.orElse(readPropertyFromLocalConfig(propertyName, optionalParentKey.orElse(ENV_SETTINGS_KEY)));
    }

    public String getProperty(String propertyName) {
        Optional<String> optionalConnectionString = Optional.ofNullable(System.getenv(propertyName));
        return optionalConnectionString.orElse(readPropertyFromLocalConfig(propertyName, ENV_SETTINGS_KEY));
    }

    public String readPropertyFromLocalConfig(String propertyName, String parentKey) {
        try (FileInputStream fis = new FileInputStream(LOCAL_SETTINGS_FILE)) {
            String data = IOUtils.toString(fis, ENCODING);
            try {
                JSONObject jsonObject = new JSONObject(data);
                return (String)((JSONObject)jsonObject.get(parentKey)).get(propertyName);
            } catch (JSONException err){
                log.error("Error reading file: " + LOCAL_SETTINGS_FILE, err.toString());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return StringUtil.EMPTY_STRING;
    }

}

如果您想在本地环境中读取 local.settings.json 文件以进行测试,您可以使用以下内容

//create a JSON parser and Read the file using FileReader

JSONParser jsonparser = new JSONParser();
FileReader localSettingsReader = new FileReader(".\local.settings.json");

//parse the Read values into object convert the object into Jsonobject

Object obj = jsonparser.parse(localSettingsReader);
JSONObject localsettingsobject = (JSONObject)obj;
String value = (String) localsettingsobj.get("YourAppSettingKeyValue");

无论如何,您已经使用相同的方式加载和读取 local.settings.json 文件 AppSettings 值。

但是如果你想在 Azure 中部署应用程序时检查你的应用程序设置值,你必须遵循以下步骤(用于本地和 Azure)。使用 System.getenv("YourAppSettingKeyValue") 查看应用设置值。

public class Function {
    public String getAppSettingsValue(@HttpTrigger(name = "req", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) String req, ExecutionContext context) {
        context.getLogger().info("My app setting value: "+ System.getenv("YourAppSettingKeyValue"));
        return String.format(req);
    }
}

参考here