Mam klasę podobną do poniższej;Makiety prywatne pole statyczne z JMockit?
class ClassA {
private static File myDir;
// myDir is created at some stage
private static String findFile(final String fileName) {
for (final String actualBackupFileName : myDir.list()) {
if (actualBackupFileName.startsWith(removeExtensionFrom(backupFile))) {
return actualBackupFileName;
}
}
}
}
Więc w zasadzie, chciałbym przetestować tej klasy przez wyśmianie się klasa File tak, że gdy lista() jest wywoływana na to zwraca listę łańcuchów zdefiniować w klasie testowej.
Mam następujące, ale nie działa z minuty na minutę, prawdopodobnie coś oczywistego robię źle - jestem nowy w JMockit - każda pomoc jest doceniana!
@Mocked("list") File myDir;
@Test
public void testClassA() {
final String[] files = {"file1-bla.txt"};
new NonStrictExpectations() {{
new File(anyString).list();
returns(files);
}};
String returnedFileName = Deencapsulation.invoke(ClassA.class, "findFile","file1.txt");
// assert returnedFileName is equal to "file1-bla.txt"
}
Po uruchomieniu powyższego testu otrzymuję NullPointerException dla pola mydir w ClassA - tak wygląda jej nie uzyskiwanie szydzili prawidłowo?
Wspaniale, dziękuję milion za pomoc Rogerio, działało to z małą zmianą kodu - @Mocked Plik myDir musiał zostać zmieniony na @Mocked (methods = {"list"}) Plik myDir, aby go uruchomić. Myślę, że to może dlatego, że wywołanie Deencapsualtion.invoke może wymagać prawdziwego obiektu File w pewnym momencie, a wyszydzanie wszystkich metod zdawało się ingerować w coś. Jestem nowym użytkownikiem, więc nie mogę głosować na ciebie - inaczej bym to zrobił! – user2586917
Świetnie! Wyśmiewanie 'File' może rzeczywiście spowodować nieoczekiwane awarie, przynajmniej w starszych wersjach JMockit. Edytowałem odpowiedź wraz ze zmianami. –
@ Rogério, powyższy sposób tworzenia symulowanego obiektu ('myDir') powoduje, że odwołanie ma wartość' null', powodując, że 'myDir.list()' kończy się niepowodzeniem z 'NPE'. Każdy pomysł, dlaczego? – mystarrocks