• 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

42 Warsaw Coding Academy
0 głosów
400 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 (280,970 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 367 wizyt
pytanie zadane 11 sierpnia 2021 w Java przez Lulex Użytkownik (820 p.)
0 głosów
3 odpowiedzi 2,679 wizyt
pytanie zadane 12 sierpnia 2018 w Java przez must Bywalec (2,980 p.)
0 głosów
0 odpowiedzi 170 wizyt
pytanie zadane 21 października 2017 w Java przez ShiroUmizake Nałogowiec (46,300 p.)

93,383 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,744 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...