• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

mockowanie plików i otrzymywanie listy plików z TemporaryFolder

0 głosów
108 wizyt
pytanie zadane 29 sierpnia 2021 w Java przez Lulex Użytkownik (670 p.)

Siema.

Zrobiłem sobie metodkę, która zwraca mi listę wszystkich plików .java jakie są w przekazanym folderze (nie chcę modyfikować metod).

public List<File> findJavaFiles(String path) {
        String suffix = ".java";
        File root = new File(path);
        List<File> list = new ArrayList<>();
        if (root.isDirectory()) {
            File[] files = root.listFiles();
            if (files != null) {
                for (File file : files) {
                    list.addAll(findJavaFiles(file, suffix));
                }
            }
        } else if (root.getName().endsWith(suffix)) {
            list.add(root);
        }
        return list;
    }

    private List<File> findJavaFiles(File root, String path) {
        String suffix = ".java";
        List<File> list = new ArrayList<>();
        if (root.isDirectory()) {
            File[] files = root.listFiles();
            if (files != null) {
                for (File file : files) {
                    list.addAll(findJavaFiles(file, suffix));
                }
            }
        } else if (root.getName().endsWith(suffix)) {
            list.add(root);
        }
        return list;
    }

I to działa, jednak chciałem napisać do tego testy. Dopiero raczkuje w Mock'ach więc myślę, że to będzie spoko zadanie do tego i z tego co się dowiedziałem najlepiej użyć TemporaryFolder, więc utworzyłem coś takiego:

 @Rule
    public TemporaryFolder temporaryFolder = new TemporaryFolder();

 @Before
public void setUp() throws IOException {
        temporaryFolder.create();
        file1 = mock(File.class);
        when(file1.getName()).thenReturn("file1.java");
        when(file1.length()).thenReturn(1L);
        file2 = mock(File.class);
        when(file2.getName()).thenReturn("file2.java");
        when(file2.length()).thenReturn(5L);
        file3 = mock(File.class);
        when(file3.getName()).thenReturn("file3.java");
        when(file3.length()).thenReturn(3L);
        file4 = mock(File.class);
        when(file4.getName()).thenReturn("file4.jpg");
        when(file4.length()).thenReturn(10L);

        temporaryFolder.newFile(file1.getName());
        temporaryFolder.newFile(file2.getName());
        temporaryFolder.newFile(file3.getName());
        temporaryFolder.newFile(file4.getName());

Mockuje i długość pliku, bo używam w innej metodzie (które test swoją drogą też nie działa :) ).

Przechodząc do samego testu. Jak znaleźć ścieżkę do tego TemporaryFolder? Korzystając  System.getProperty przenosi mnie do tmp, ale tam jest dużo więcej plików, niż te 3 które powinny być rezultatem. czy ścieżka jest błędna?

@Test
    public void findJavaFilesIsCorrect() {
        //given
        List<File> expectedResult = List.of(file1, file2, file3);
        //when
        when(fileService.findJavaFiles(ArgumentMatchers.anyString())).thenCallRealMethod();
        List<File> result = fileService.findJavaFiles(System.getProperty("java.io.tmpdir"));
        //then
        Assert.assertEquals(expectedResult, result);
    }

 

1 odpowiedź

0 głosów
odpowiedź 29 sierpnia 2021 przez Wiciorny Ekspert (219,110 p.)

chciałem odpowiedzieć jakoś rzetelniej, ale tutaj podstawowy problem to stosowanie czegoś, czego nie rozumiesz...

Przede wszystkim decydujesz się na adnotacje @Rule, wykorzystując JUnit5 runner'a do tego, żeby przygotować "cechy wspólne" dla wszystkich swoich testów, a następnie  korzystasz z @Before
W ogóle zaglądałeś do intefejsów  adnotacji? Czytałeś dokumnetacje rule vs before? 

by użyć @Rule, potrzebujesz klasy, która implementuje TestRule(preferowane) lub MethodRule, jak można przeczytać tutaj . Podczas  gdy  potem stosujesz @Before które wymaga  napisania nowej metody w każdym przypadku testowym, 
@Rule nie, ponieważ jest to tylko instancja już istniejącego kodu.


Dodatkowo określiłeś, że mokujesz - nie to nie jest mokowanie.  

Dlaczego mówię o zrozumieniu z czego się korzysta, bo @Rule ;] ma rózne klasy, tez sam je mozesz definiować, to teraz moje pytanie jest takie, z jakiego runnera korzysta "TemporyFolder" klasa? może BEFORE ALL? Albo AFTER EACH? etc... sprawdź dokładnie cykl wywołania.
Dalej jeszcze co najlepsze, korzystasz z obiektu w before  wykorzystujac metody " temoportFolder".

Najważniejsze teraz twoje stwierdzenie na początku 

 (nie chcę modyfikować metod).

ale to nie ma znaczenia, co się znajduje w testowanej metodzie. Najpierw przestudiuj czym jest TESTOWANIE, testujesz zachowania funkcji, a nie ich konkretne implementacje to co mają w środku, testując "gówno" obchodzi Cię jaki algorytm, co i jak jest tam wykonywane. 
Masz na starcie zdefiniowane " to co ma być przetestowane" -> i jaki ma to dac rezultat. 
To jest idea testów integracyjno-jednostkowych  when -> zdarzenie, then -> reakcja. Oczekujemy odpowiedniej reakcji na odp. zestaw testowy ( zdarzenie ) .

Chętnie pomogę jak zaznajomisz się już z podstawami tego co używasz, pewnie wtedy nie będzie nawet pomocy na forum potrzebował, bo sam sprawnie dojdziesz do rozwiązania, czemu twój kod nie działa. Jak nie, to pisz priw, lub pytaj dalej ;] 
 

Podobne pytania

+1 głos
0 odpowiedzi 100 wizyt
pytanie zadane 11 sierpnia 2021 w Java przez Lulex Użytkownik (670 p.)
0 głosów
1 odpowiedź 108 wizyt
pytanie zadane 18 lipca 2021 w Java przez Lulex Użytkownik (670 p.)
+2 głosów
1 odpowiedź 191 wizyt

87,946 zapytań

136,527 odpowiedzi

304,411 komentarzy

58,313 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...