Chcę opisać logikę, która tworzy pliki z testami jednostkowymi. Czy można sfałszować klasę File i uniknąć rzeczywistego tworzenia plików?Czy można użyć PowerMocka do fałszywego tworzenia nowego pliku?
Odpowiedz
Makiety konstruktora, jak w tym przykładzie kodu. Nie zapomnij umieścić klasę, która wywoła "nowy plik (...)" w @PrepareForTest
package hello.easymock.constructor;
import java.io.File;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({File.class})
public class ConstructorExampleTest {
@Test
public void testMockFile() throws Exception {
// first, create a mock for File
final File fileMock = EasyMock.createMock(File.class);
EasyMock.expect(fileMock.getAbsolutePath()).andReturn("/my/fake/file/path");
EasyMock.replay(fileMock);
// then return the mocked object if the constructor is invoked
Class<?>[] parameterTypes = new Class[] { String.class };
PowerMock.expectNew(File.class, parameterTypes , EasyMock.isA(String.class)).andReturn(fileMock);
PowerMock.replay(File.class);
// try constructing a real File and check if the mock kicked in
final String mockedFilePath = new File("/real/path/for/file").getAbsolutePath();
Assert.assertEquals("/my/fake/file/path", mockedFilePath);
}
}
Nie jestem pewien, czy jest to możliwe, ale miałem taki wymóg i rozwiązałem go, tworząc interfejs FileService
. Zamiast więc bezpośrednio tworzyć pliki lub uzyskiwać do nich dostęp, dodajesz abstrakcję. Wtedy możesz łatwo kpić z tego interfejsu podczas testów.
Na przykład:
public interface FileService {
InputStream openFile(String path);
OutputStream createFile(String path);
}
Następnie w swojej klasie przy użyciu to:
public class MyClass {
private FileService fileService;
public MyClass(FileService fileService) {
this.fileService = fileService;
}
public void doSomething() {
// Instead of creating file, use file service
OutputStream out = fileService.createFile(myFileName);
}
}
A w teście
@Test
public void testOperationThatCreatesFile() {
MyClass myClass = new MyClass(mockFileService);
// Do your tests
}
ten sposób można nawet wyśmiewać go bez mock biblioteki.
Prawidłowo. Kiedy nie możesz kpić, zawiń to w abstrakcję (interfejs), a następnie zrób to. –
Ale wtedy zmieniasz prawdziwy kod, aby pomóc w testach, to jest dobre i możliwe, aby tego uniknąć z EasyMock/PowerMock – cahen
@CarlosHenriqueRodriguez Tak, jesteś. I to dobrze. Pisanie kodu, który można przetestować (często) zmniejsza sprzężenie w kodzie. Powinieneś rozważyć kod testowy, aby stać się częścią twojej architektury. – NilsH
spróbować PowerMockito
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
@PrepareForTest(YourUtilityClassWhereFileIsCreated.class)
public class TestClass {
@Test
public void myTestMethod() {
File myFile = PowerMockito.mock(File.class);
PowerMockito.whenNew(File.class).withAnyArguments().thenReturn(myFile);
Mockito.when(myFile.createNewFile()).thenReturn(true);
}
}
- 1. Mockito rzuca NullPointer podczas tworzenia fałszywego obiektu
- 2. Czy można użyć poprzedniego parametru funkcji do zadeklarowania nowego?
- 3. Które artefakty Maven powinienem użyć do importowania PowerMocka?
- 4. Czy istnieje sposób wprowadzania wielowątkowego kakao bez tworzenia fałszywego NSThread?
- 5. Zdarzenie Select2 do tworzenia nowego znacznika
- 6. Czy można użyć pliku kompilacji ANT jako pliku kompilacji Phing?
- 7. Błąd podczas tworzenia nowego pliku tekstowego z pythonem?
- 8. Czy można użyć XmlAttributes do selektywnej XmlIgnore?
- 9. Czy można użyć jQuery do odczytania metatagów?
- 10. Android; Sprawdź, czy plik istnieje bez tworzenia nowego
- 11. Czy można użyć parametru do utworzenia nowego klucza obiektu i jako zmiennej w tej samej funkcji?
- 12. Nie można załadować nowego pliku APK do sklepu Android Play
- 13. Czy można użyć programu NBuilder do tworzenia kolekcji losowych ciągów znaków?
- 14. Czy można również użyć pliku Settings.ettings dla stron ASP.Net?
- 15. Czy można użyć #define z innego pliku cpp?
- 16. Do czego można użyć std :: remove_extent?
- 17. Do "nowego" lub nie do "nowego"
- 18. Czy jest jakiś sposób użyć nowego DrawerLayout z ActionBarSharlock?
- 19. Młotek do fałszywego zoomu nie działa
- 20. Czy mogę użyć mojego ssh-public-key do odszyfrowania pliku?
- 21. tworzenia nowego użytkownika DSN ODBC z Delphi
- 22. Czy można użyć polecenia linux cat do zapisania tekstu do pliku?
- 23. Czy można użyć JAXB do odwzorowania ze schematu na java.util.Map?
- 24. Jak zaktualizować obiekt użytkownika bez tworzenia nowego?
- 25. Jak pobrać identyfikator modelu podczas tworzenia nowego?
- 26. Prevent MATLAB z tworzenia nowego pliku, gdy nie może znaleźć pliku chcę otworzyć
- 27. Czy można użyć losowego identyfikatora tekstury?
- 28. Wiązanie klucza dla "nowego widoku do pliku"
- 29. Czy w czasie tworzenia można przekazać słownik do modeli django?
- 30. Czy można używać gradle do tworzenia projektów scala?
To jest dobre pytanie. Nie zasługuje na obniżenie oceny. –
Czy próbowałeś używać PowerMocka? PowerMock wyśmiewa tworzenie nowych obiektów wewnątrz metody, więc powinno działać. –