• 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

0 głosów
464 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 (282,500 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 414 wizyt
pytanie zadane 11 sierpnia 2021 w Java przez Lulex Użytkownik (820 p.)
0 głosów
3 odpowiedzi 3,119 wizyt
pytanie zadane 12 sierpnia 2018 w Java przez must Bywalec (2,980 p.)
0 głosów
0 odpowiedzi 203 wizyt
pytanie zadane 21 października 2017 w Java przez ShiroUmizake Nałogowiec (46,300 p.)

93,608 zapytań

142,531 odpowiedzi

323,004 komentarzy

63,101 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

Kursy INF.02 i INF.03
...