【问题标题】:mvn unit test common resource folder and read file functionalitymvn 单元测试公共资源文件夹和读取文件功能
【发布时间】:2014-02-26 02:28:34
【问题描述】:

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

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”);

【问题讨论】:

    标签: java unit-testing maven intellij-idea


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案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");
         } }
        

      并且所有需要重用这个方法的类都应该像这样调用

      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();
          }
      }
      

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

      希望对你有帮助

      【讨论】:

      • thx,如何重用多个文件和测试类? test1Test 的 file1.json,test2Test 的 file2.json?你所拥有的看起来只支持一个实例或多个 BaseTest 类?
      猜你喜欢
      • 2011-04-22
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      相关资源
      最近更新 更多