Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Config.properties仅在调用两次时返回值_Java_Testing_Junit - Fatal编程技术网

Java Config.properties仅在调用两次时返回值

Java Config.properties仅在调用两次时返回值,java,testing,junit,Java,Testing,Junit,我有一个正在运行测试的程序,我有一个特殊的方法,试图访问config.properties文件值。它在我第一次调用它时返回null,并且只在第二次调用它后返回一个值,我不知道为什么 下面是我的测试,我在其中调用了两次getHostProp()方法 @Test public void testHost() throws Exception { //when notMocked.getHostProp(); assertEquals("tkthli.com", notMoc

我有一个正在运行测试的程序,我有一个特殊的方法,试图访问
config.properties
文件值。它在我第一次调用它时返回null,并且只在第二次调用它后返回一个值,我不知道为什么

下面是我的测试,我在其中调用了两次
getHostProp()
方法

@Test
public void testHost() throws Exception {

    //when
    notMocked.getHostProp();
    assertEquals("tkthli.com", notMocked.getHostProp());
}
以及它所测试的类中的方法

public class ConfigProperties {
    Properties prop = new Properties();
    String propFileName = "config.properties";

    public String getHostProp() throws IOException {

        String host = prop.getProperty("DAILY-DMS.instances");
        if(foundFile()) {
            return host;
        }
        return "Error";
    }
}
这是我用来检查是否找到config.properties的路径的助手方法。我不确定它会如何影响这一点,但我添加它只是为了防止有人看到我不知道的东西,这可能会导致问题

public boolean foundFile() throws IOException {
    InputStream inputStream = getClass().getClassLoader().getResourceAsStream(propFileName);

    if (inputStream != null) {
        prop.load(inputStream);
        inputStream.close();
        return true;
    } else {
        throw new FileNotFoundException("property file '" + propFileName + "' not found in the classpath.");

    }
}

您没有加载属性'prop'并尝试获取“DAILY-DMS.instances”属性!
它第二次工作的原因是因为方法foundFile()实际上将属性加载到'prop'成员变量中,并在第一次调用getHostProp()方法时返回true。

在第二次调用期间,您的'prop'成员变量已准备好加载的值


希望我能回答你的问题,你能试试这个吗

if(foundFile()) {
   return prop.getProperty("DAILY-DMS.instances");
}
prop
对象仅在调用
foundFile()
后填充,但是您正在读取前一行中的数据


另外,除非您在运行时更新配置文件,否则我建议您先读取属性文件,然后将其存储在某个静态对象或单例中。这样您就可以避免任何进一步的文件读取。只是想一想。

啊,我明白了@redflar3如果它试图在我填充数据之前读取数据,为什么不给我一个空指针异常?@ralphie9224没有任何东西试图取消空指针的引用。@ralphie9224[本页解释NPE何时发生。代码中一种可能的情况是
assertTrue
语句。该语句必须检查参数的值以检查是否相等,并可能引发NPE。但是
assertTrue
是使用字符串#equals在内部实现的。如果检查源代码,您可以看到它NORE不是
String
实例的任何对象(作为参数传递)。因此,空引用的String对象将被忽略,并返回false。@ralphie9224-它不会引发NullPointerException,因为您已经初始化了“prop”成员变量,如下所示:“Properties prop=new Properties();”因此,您现在可以从“prop”访问任何方法。如果您阅读了我上面的答案,那么您可以了解发生了什么。您可以从java api中找到有关Properties.java如何工作的更多信息,因为如果未找到文件,您将引发异常,您可以忽略检查
If(foundFile){..}
,直接给出
fileFound();return prop.getPr….
。您从
foundFile
得到的唯一返回是
true
,因此我看不到执行
返回“错误”
的场景。