Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 mvn单元测试公用资源文件夹和读取文件功能_Java_Unit Testing_Maven_Intellij Idea - Fatal编程技术网

Java mvn单元测试公用资源文件夹和读取文件功能

Java mvn单元测试公用资源文件夹和读取文件功能,java,unit-testing,maven,intellij-idea,Java,Unit Testing,Maven,Intellij Idea,我有以下用于测试的目录结构 test /java /com.mycompany test1Test test2Test /resources /jsonFiles file1.json file2.json 然后在我的每个测试中,我从相应的输入json文件中读取: @Test public void testFile1() { // read a file from the resources directory myobj = n

我有以下用于测试的目录结构

test
 /java
   /com.mycompany
     test1Test
     test2Test
 /resources
  /jsonFiles
    file1.json
    file2.json
然后在我的每个测试中,我从相应的输入json文件中读取:

@Test
public void testFile1()
{
   // read a file from the resources directory
   myobj = new myObject();
   myobj.setFileContentsAsString(test1Test.class.getResourcesAsStream("/jsonFiles/file1.json");
}
我的问题分为两部分:

1) 由于每个测试类的多个测试用例中都会使用它,因此在不必指定className.getResourceAsStream()的情况下读入文件内容的更好方法是什么。看来我是在重复使用更好的东西


2) 我可以把查找文件资源的路径放在哪里,而不必硬编码“jsonFiles”作为实际文件的前缀呢?我更愿意称之为绝对值(“file1.json”)

读取文件的最佳方法是使用resourceAsStream。但是这里有一些方法可以避免在不同的测试用例中编写同一文件的多次读取操作

  • 编写一个具有

    public class BaseTest{
    
     protected myObject myobj;
    
     @Before
     public void setUp() {
        // read a file from the resources directory
        myobj = new myObject();
        myobj.setFileContentsAsString(
                   test1Test.class.getResourcesAsStream("/jsonFiles/file1.json");
     } }
    
  • 所有需要恢复这个方法的类都应该像

    public class Test1 extends BaseTest {
    
        @Before
        public void setUp() {
            super.setUp();
        }
    }
    
    因此,现在对象myobj在您只加载一次的所有测试类中都可用

    第二个问题是基于要求

    [编辑]

     public class BaseTest{
    
         private String filePath;
         public BaseTest(String filePath) {
             this.filePath = filePath;
         }
         protected myObject myobj;
    
         @Before
         public void setUp() {
            // read a file from the resources directory
            myobj = new myObject();
            myobj.setFileContentsAsString(
                       test1Test.class.getResourcesAsStream("/jsonFiles/" + filePath);
         } }
    
    因此,基类将强制其扩展类创建公共构造函数,该构造函数也应传递文件名

    public class Test1 extends BaseTest {
    
        public Test1() {
            super("file1.json");
        }
    
        @Before
        public void setUp() {
            super.setUp();
        }
    }
    
    public class Test2 extends BaseTest {
    
        public Test2() {
            super("file2.json");
        }
    
        @Before
        public void setUp() {
            super.setUp();
        }
    }
    
    这样,每个测试文件都可以传递不同的文件名


    希望这有帮助

    读取文件的最佳方法是使用resourceAsStream。但是这里有一些方法可以避免在不同的测试用例中编写同一文件的多次读取操作

  • 编写一个具有

    public class BaseTest{
    
     protected myObject myobj;
    
     @Before
     public void setUp() {
        // read a file from the resources directory
        myobj = new myObject();
        myobj.setFileContentsAsString(
                   test1Test.class.getResourcesAsStream("/jsonFiles/file1.json");
     } }
    
  • 所有需要恢复这个方法的类都应该像

    public class Test1 extends BaseTest {
    
        @Before
        public void setUp() {
            super.setUp();
        }
    }
    
    因此,现在对象myobj在您只加载一次的所有测试类中都可用

    第二个问题是基于要求

    [编辑]

     public class BaseTest{
    
         private String filePath;
         public BaseTest(String filePath) {
             this.filePath = filePath;
         }
         protected myObject myobj;
    
         @Before
         public void setUp() {
            // read a file from the resources directory
            myobj = new myObject();
            myobj.setFileContentsAsString(
                       test1Test.class.getResourcesAsStream("/jsonFiles/" + filePath);
         } }
    
    因此,基类将强制其扩展类创建公共构造函数,该构造函数也应传递文件名

    public class Test1 extends BaseTest {
    
        public Test1() {
            super("file1.json");
        }
    
        @Before
        public void setUp() {
            super.setUp();
        }
    }
    
    public class Test2 extends BaseTest {
    
        public Test2() {
            super("file2.json");
        }
    
        @Before
        public void setUp() {
            super.setUp();
        }
    }
    
    这样,每个测试文件都可以传递不同的文件名


    希望这对mvn有所帮助。您可以在超级类或测试实用程序类中创建方法:

    public static InputStream getJsonFileAsStream(String jsonFile)
    {
        return ClassLoader.getSystemResourceAsStream("/jsonFiles/" + jsonFile);
    }
    

    然后,您可以在需要的地方重用它。

    这并不是mvn所特有的。您可以在超级类或测试实用程序类中创建方法:

    public static InputStream getJsonFileAsStream(String jsonFile)
    {
        return ClassLoader.getSystemResourceAsStream("/jsonFiles/" + jsonFile);
    }
    

    然后,您可以在需要的地方重用它。

    thx,我如何重用多个文件和测试类?file1.json用于test1Test,file2.json用于test2Test?您所拥有的看起来只支持一个实例或多个BaseTest类?thx,我如何重用多个文件和测试类?file1.json用于test1Test,file2.json用于test2Test?您所拥有的看起来只支持一个实例或多个BaseTest类?