2015-11-05 381 views
0

我有一个简单的测试案例:JUnit测试用例失败

public class FileManagerTest { 
    String dirPath = “/myDir/” 
    @Before 
    public void setUp() { 
    mFileManager = MyFileManager.getInstance(); 
    } 

    @Test 
    private void testPersistFiles() { 
     System.out.println(“testPersistFiles()…”); 

     //it deletes old files & persists new files to /myDir/ directory 
     boolean successful =mFileManager.persistFiles(); 

     Assert.assertTrue(successful); 
    } 

    @Test 
    public void testGetFiles() { 
    System.out.println(“testGetFiles()…”); 

    mFileManager.persistFiles(); 
    //I double checked, the persistFiles() works, the files are persisted. 

    List<File> files = mFileManager.getFilesAtPath(dirPath); 
    Assert.assertNotNull(files); //Failure here!!!! 
    } 

    @Test 
    public void testGetFilesMap() { 
    System.out.println(“testGetFilesMap()…”); 

    mFileManager.persistFiles(); 

    Map<String, File> filesMap = mFileManager.getFilesMapAtPath(dirPath); 
    Assert.assertNotNull(files); 
    } 
} 

FileManagerpersistFiles()功能删除所有文件在/ MYDIR /然后再坚持的文件。

正如您在上面看到的,我在每个测试函数中都有一个System.out.println(…)。当我运行它,我可以看到以下顺序全部打印:

testGetFilesMap()… 
testGetFiles()… 
testPersistFiles()… 

然而,测试失败的testGetFiles()。有两件事情我不明白:

  1. 我不明白,这是失败的testGetFiles()为什么我仍然可以看到这听起来像它甚至失败的打印testPersistFiles(),它不会停止运行,但继续运行下一个测试testPersistFiles()? JUnit测试用例中幕后发生了什么?

  2. 我不明白的另一件事是为什么testGetFiles()失败?我可以看到persistFiles()已保存文件的日志。为什么它在那之后变为空?

+0

我们需要看一些代码来回答#2。 –

回答

1

我不明白,这是失败的,在这听起来像它甚至失败testGetFiles()为什么我仍然可以看到打印testPersistFiles(),我

那是怎么单元测试工作。每个测试应该被隔离并且仅使用其一组数据进行工作。单元测试框架运行每个测试,以便您可以查看系统的哪些部分可以工作,哪些不需要,他们不会在第一次失败时停下来。

+0

如果多个测试函数调用persistFiles(),他们是否同步调用此函数? – user842225

+0

可能(但是,默认情况下不会)。然而(假设MyFileManager不是一个单例),它们每个都有一个不同的MyFileManager实例。你还应该使用像[TemporaryFolder](http://junit.org/apidocs/org/junit/rules/TemporaryFolder.html)这样的每个测试都有自己的空间来玩。 –

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 – DJClayworth

0
mFileManager.getFilesAtPath(dirPath); 

你是不是在正确的地方寻找档案

String dirPath = “/myDir/” 

你确定这条道路是确定的?用目录名称前的斜杠?

0

对于您的每个测试,JUnit都会创建该类的单独实例并运行它。由于您似乎有3个测试,JUnit会为您的类创建3个实例,在它们的每个上执行@Before以初始化状态,然后运行它们。 它们的运行顺序通常是写入测试的顺序,但不能保证。

现在关于print语句 - 您会发现它是测试中的第一条语句,因此它将被执行。然后mFileManager.persistFiles();被执行。由于某种原因,它返回一个错误,因此测试失败。

至于为什么它返回false,你可以运行一个本地调试器,在该方法的开始处插入一个断点,单步执行并查看。