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

时间:2014-02-26 02:28:34

标签: 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 = new myObject();
   myobj.setFileContentsAsString(test1Test.class.getResourcesAsStream("/jsonFiles/file1.json");
}

我的问题是两部分:

1)读取文件内容的更好方法是不必指定className.getResourceAsStream(),因为它将在每个测试类的多个测试用例中使用。似乎我重用了更好的东西?

2)我可以在哪里找路径来查找文件资源而不必硬编码“jsonFiles”作为实际文件的前缀?我宁愿把一些东西称为绝对的(“file1.json”);

2 个答案:

答案 0 :(得分:3)

这并非真正特定于mvn。您可以在超类或测试实用程序类中创建方法:

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

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

答案 1 :(得分:2)

读取文件的最佳方法是使用resourceAsStream。但是,您可以采取以下措施来避免在不同的测试用例中编写相同文件操作的多次读取。

  1. 编写一个具有

    的基础测试类
    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");
     } }
    
  2. 并且需要重新使用此方法的所有类都应该像

    一样调用
    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();
        }
    }
    

    这样,每个测试文件都可以传递不同的文件名。

    希望这有帮助