• 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

VPS Starter Arubacloud
0 głosów
268 wizyt
pytanie zadane 29 sierpnia 2021 w Java przez Lulex Użytkownik (820 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 (269,120 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 264 wizyt
pytanie zadane 11 sierpnia 2021 w Java przez Lulex Użytkownik (820 p.)
0 głosów
1 odpowiedź 382 wizyt
pytanie zadane 18 lipca 2021 w Java przez Lulex Użytkownik (820 p.)
+2 głosów
1 odpowiedź 244 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...