2012-08-29 3 views
1

Я пытаюсь проверить метод, который копирует исходный файл в файл dest с помощью JUnit's TemporaryFolder. Я получаю Java IOException, когда я пытаюсь запустить этот тест. Имеет ли значение, где я делаю объявление для папки? (У моего тестового класса есть несколько разных тестов). И если да, то каков правильный способ сделать это? Я спрашиваю, потому что в настоящее время у меня есть несколько модульных тестов над этим кодом, затем я пытаюсь настроить тестирование для копирования файлов. Возможно, блок должен быть в своем классе? @Rule - - @Test Вот фрагмент кода, где я закодированы тест:JUnit: Когда я объявляю объект TemporaryFolder?

...other tests...then: 

@Rule 
public static TemporaryFolder tmp = new TemporaryFolder(); 
private File f1, f2; 

@Before 
public void createTestData() throws IOException { 
    f1 = tmp.newFile("src.txt"); 
    f2 = tmp.newFile("dest.txt"); 

    BufferedWriter out = new BufferedWriter(new FileWriter(f1)); 
    out.write("This should generate some \n" + 
      "test data that will be used in \n" + 
      "the following method."); 
    out.close(); 
} 

@Test 
public void copyFileTest() { 

    out.println("file 1 length: " + f1.length()); 
    try { 
     copyFile(f1, f2); 
    } catch (IOException e) { 
     e.getMessage(); 
     e.printStackTrace(); 
    } 

    if (f1.length() != f2.length()) 
     fail(); 
    else if (!f1.equals(f2)) 
     fail(); 
    assertSame(f1, f2); 
} 

Когда я запускаю этот тестовый класс, все 11 моих испытаний в настоящее время не в состоянии (которые ранее прошли) и я получаю java.io.IOException: No such file or directory.

ответ

2

Так, глядя на JUnit Javadoc, я обнаружил, что любое заявление в соответствии @Rule должен быть публичным, и не статична. Так что я взял статический и просто:

@Rule 
public TemporaryFolder tmp = new TemporaryFolder(); 

Я до сих пор не знаю наверняка, если это имеет значение, когда это заявление сделано, когда у вас есть другие модульные тесты в классе, которые не используют @Rule декларацию, но это позволило мне успешно пройти тесты.

1

Если вы действительно хотите объявить TemporaryFolder как static, вы можете использовать @ClassRule, который используется для аннотации статических полей, содержащих правило.

@ClassRule 
public static TemporaryFolder tmp = new TemporaryFolder(); 

Ссылка: http://junit-team.github.io/junit/javadoc/4.10/org/junit/ClassRule.html