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

mockito - testy pilków i folderów

Object Storage Arubacloud
0 głosów
281 wizyt
pytanie zadane 17 kwietnia 2021 w Java przez Lulex Użytkownik (820 p.)

Siema.

Dopiero co startuję z testowanie z pomocą mocków, chciałem sobie utrudnić nieco zadanie i zrobiłem coś takiego:

Mam metodę w klasie która zwraca mi listę plików które kończą się danym rozszerzeniem:

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

I teraz chcę to sobie przetestować jak należy. Zrobiłem folder w testach i wrzuciłem do niego pliku:

public class FileServiceTest {
    private FileService fileService;
    private TemporaryFolder temporaryFolder;

    @Before
    public void setUp() throws Exception {
        fileService = mock(FileService.class);

        temporaryFolder = mock(TemporaryFolder.class);
        File file1 = temporaryFolder.newFile("file.java");
        File file2 = temporaryFolder.newFile("file.swf");
        File file3 = temporaryFolder.newFile("file2.java");
        File file4 = temporaryFolder.newFile("picture.jpg");
        File file5 = temporaryFolder.newFile("photo.jpg");
        File file6 = temporaryFolder.newFile("movie.mp4");
        File file7 = temporaryFolder.newFile("music.mp3");
        File file8 = temporaryFolder.newFile("someFile.java");
        File file9 = temporaryFolder.newFile("someDoc.doc");
        File file10 = temporaryFolder.newFile("excelThing.xls");
        File file11 = temporaryFolder.newFolder("java");
    }

    @Test
    public void findFilesUsingSuffixIsTrue() throws IOException {
        //given
        List<File> expectedList = List.of(
                new File("file.java"), new File("file2.java"), new File("someFile.java")
        );

        when(fileService.findFilesUsingSuffix(ArgumentMatchers.any(File.class),any(String.class))).thenCallRealMethod();

        //when
        List<File> result = fileService.findFilesUsingSuffix(temporaryFolder.getRoot(), ".java");

        //then
        assertEquals(expectedList, result);
    }
}

 

Test jednak nie przechodzi, w result'cie  zwraca pustą listę i nie mogę wyłapać co nie gra.

1 odpowiedź

0 głosów
odpowiedź 17 kwietnia 2021 przez Wiciorny Ekspert (269,710 p.)

Na wstepie nie widzę mokowania... 
po pierwsze inicjalizacja moków, po drugie co testujemy bo generalnie nie widać co chcesz testować nie wiemy nic o klasie serwisu, wiec nawet nie wiemy jakie ma dane. 
 

 /**
     * Setup before test.
     */
    @BeforeMethod
    public void beforeMethod() {
        MockitoAnnotations.initMocks(this);
    }

 

komentarz 17 kwietnia 2021 przez Lulex Użytkownik (820 p.)

W FileService są tylko metody, stworzone tylko aby ćwiczyć testowanie. 

Mam tam jeszcze jedną metodę, której kod wygląda tak (metoda getDay wyciąga mi dzień tygodnia w Stringu z daty):

public Map<String, Long> countModifiedFilesByWeekday(List<File> files) {
       Map<String, Long> map = new HashMap<>();
        for (File file : files) {
            long date = file.lastModified();
            Date d = new Date(date);
            String day = getDay(d);
            map.merge(day, 1L, Long::sum);
        }
        return map;
    }

i jej test, który przechodził elegancko wyglądał tak:

public class FileServiceTest {
    private FileService fileService;
    private File f1;
    private File f2;
    private List<File> mockedFiles;
    private long millis;
    private TemporaryFolder temporaryFolder;

    @Before
    public void setUp() throws Exception {
        String myDate = "2021/4/14 18:10:45";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date = sdf.parse(myDate);
        millis = date.getTime();

        fileService = mock(FileService.class);
        f1 = mock(File.class);
        when(f1.getName()).thenReturn("nazwa.java");
        when(f1.lastModified()).thenReturn(millis);

        f2 = mock(File.class);
        when(f2.getName()).thenReturn("nazwa.java");
        when(f2.lastModified()).thenReturn(millis - 100000000);

        mockedFiles = new ArrayList<>();
        mockedFiles.add(f1);
        mockedFiles.add(f2);
    }

@Test
    public void countModifiedFilesByWeekdayIsTrue() {
        // given
        Map<String, Long> expected = Map.of(
                "środa", 1L,
                "wtorek", 1L
        );

        when(fileService.countModifiedFilesByWeekday(ArgumentMatchers.anyList())).thenCallRealMethod();
        when(fileService.getDay(any(Date.class))).thenCallRealMethod();

        //when
        Map<String, Long> result = fileService.countModifiedFilesByWeekday(mockedFiles);

        //then
        assertEquals(expected, result);
    }
}

 

komentarz 18 kwietnia 2021 przez Lulex Użytkownik (820 p.)

Udało się dojść do takiego etapu:

public class FileServiceTest {
    private FileService fileService;
    private File file1;
    private File file2;
    private File file3;
    private File file4;
    private File file5;

    @Rule
    public TemporaryFolder temporaryFolder = new TemporaryFolder();

    @Before
    public void setUp() throws Exception {

        fileService = mock(FileService.class);

        file1 = mock(File.class);
        when(file1.getName()).thenReturn("file1.java");
        file2 = mock(File.class);
        when(file2.getName()).thenReturn("file2.swf");
        file3 = mock(File.class);
        when(file3.getName()).thenReturn("picture.jpg");
        file4 = mock(File.class);
        when(file4.getName()).thenReturn("photo.jpg");
        file5 = mock(File.class);
        when(file5.getName()).thenReturn("file.java");

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

    @Test
    public void findFilesUsingSuffixIsTrue() throws IOException {
        //given
        List<File> expectedList = List.of(
                new File("file.java"), new File("file2.java")
        );

        when(fileService.findFilesUsingSuffix(ArgumentMatchers.any(File.class),any(String.class))).thenCallRealMethod();

        //when
        List<File> result = fileService.findFilesUsingSuffix(temporaryFolder.getRoot(), ".java");

        //then
        assertEquals(expectedList, result);
    }

 

Wcześniejsze metody zostały bez zmian. Test teoretycznie działa, ale nie do końca

Wywala błąd:

java.lang.AssertionError: 
Expected :[file.java, file2.java]
Actual   :[C:\Users\RAFA~1\AppData\Local\Temp\junit18196768413988432045\file.java, 
C:\Users\RAFA~1\AppData\Local\Temp\junit18196768413988432045\file1.java]

Czy musze zmienić coś w metodzie czy w teście?

Podobne pytania

+1 głos
0 odpowiedzi 265 wizyt
pytanie zadane 11 sierpnia 2021 w Java przez Lulex Użytkownik (820 p.)
0 głosów
3 odpowiedzi 1,851 wizyt
pytanie zadane 12 sierpnia 2018 w Java przez must Bywalec (2,980 p.)
0 głosów
0 odpowiedzi 137 wizyt
pytanie zadane 21 października 2017 w Java przez ShiroUmizake Nałogowiec (46,300 p.)

92,551 zapytań

141,397 odpowiedzi

319,527 komentarzy

61,936 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...