2013-06-18 11 views
9

Mam klasę, która przyjmuje pojedynczy plik, znajduje plik z nim powiązany i otwiera go. Coś wzdłuż liniiMockito - Kpiny z pliku

class DummyFileClass 
{ 
    private File fileOne; 
    private File fileTwo; 
    public DummyFileClass(File fileOne) 
    { 
     this.fileOne = fileOne; 
     fileTwo = findRelatedFile(fileOne) 
    } 

    public void someMethod() 
    { 
     // Do something with files one and two 
    } 

} 

w moich testów jednostkowych, chcę móc przetestować metodę someMethod() bez konieczności posiadania pliki fizyczne siedzi gdzieś. Mogę wyśmiać fileOne i przekazać go do konstruktora, ale ponieważ fileTwo jest obliczany w konstruktorze, nie mam nad tym kontroli.

Mogę kpić z metody findRelatedFile() - ale czy jest to najlepsza praktyka? Poszukuje najlepszego projektu, a nie pragmatycznego rozwiązania. Jestem całkiem nowy w szyderczym środowisku.

+0

To zależy od tego, co 'someMethod()' powinien zrobić. Tu wraca tu pustka. Jaki jest efekt wywoływania tej metody przy późniejszej interakcji z twoim obiektem? – fge

+0

To nie jest jeszcze zaimplementowane, ale planowane jest odczytywanie niektórych plików z każdego wywołania, dopóki oba nie będą puste. – Ren

+1

Makabryczne "File" to, err, well, hard. Dlaczego nie chcesz pliku testowego? Możesz go ustrukturyzować tak, aby pasował do twojego testu (-ów) wystarczająco łatwo ... – fge

Odpowiedz

20

W takiej sytuacji używałbym fizycznych plików do testowania komponentu i nie polegał na szyderczym systemie. Jak podaje fge, może to być łatwiejsze i nie musisz się martwić niepoprawnymi założeniami, które możesz sobie wyobrazić.

Na przykład, jeśli polegasz na File#listFiles(), możesz mieć swoją próbę zwrócić ustaloną listę File s, jednak kolejność, w której są one zwracane, nie jest gwarantowana - fakt, że możesz odkryć, gdy uruchomisz swój kod na inna platforma.

chciałbym rozważyć użycie TemporaryFolder regułę JUnit, które pomogą Ci skonfigurować strukturę plików i katalogów, czego potrzeba do testu, np

public class DummyFileClassTest { 
    @Rule 
    public TemporaryFolder folder = new TemporaryFolder(); 

    @Test 
    public void someMethod() { 
     // given 
     final File file1 = folder.newFile("myfile1.txt"); 
     final File file2 = folder.newFile("myfile2.txt"); 

     ... etc... 
    } 
} 

Zasadą powinno oczyścić wszelkie utworzonych plików i katalogów Po zakończeniu testu .

+0

+1 PowerMock może sfałszować plik, ale zwykle jest to więcej kłopotów niż jego wartość. – samlewis

+0

Fajnie, nie wiedziałem o TemporaryFolder, używałem .deleteOnExit do tej pory :) – Lenymm