Test Jednostkowe do metody zmieniającą plik na byte[]

0

Hej mam problem w przetestowaniu metody konwertująca plik w byte[]. Są jakieś "Mockfiles", którym można ustawić rozmiar pliku lub folderu
Moja metoda :

public class ReadByte {

	public byte[] readByteArrFromFile(File folder) throws IOException {

		File[] files = folder.listFiles();

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ZipOutputStream zout = new ZipOutputStream(baos);

		byte[] buffer = new byte[4096];

		for (int i = 0; i < files.length; i++) {

			FileInputStream fin = new FileInputStream(files[i]);
			zout.putNextEntry(new ZipEntry(files[i].getName()));

			int length;
			while ((length = fin.read(buffer)) > 0) {
				zout.write(buffer, 0, length);
			}

			zout.closeEntry();
			fin.close();
		}

		zout.close();

		return baos.toByteArray();
	}

}
0

Popraw kolorowanie składni
Jaki konkretnie kod chcesz przetestować? (wygląda na to, że ten kod jest napisany dla zbyt szczegółowego przypadku przez co trudny do przetestowania)
Jaki test już napisałeś?
JRE chyba dostarcza już taką funkcjonalność! http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#readAllBytes(java.nio.file.Path)

Teraz widzę, że nazwa funkcji swoje, kod swoje. Klasyczne zaproszenie bug-a.

2

W Javce można stworzyć wirtualny system plików w pamięci. Post na StackOverflow: In-memory file system in java

Mimo wszystko wolałbym skorzystać z gotowej metody wczytującej plik do tablicy bajtów. Jedną podał @MarekR22 . Szereg innych znajduje się w Apache Commons IO: https://commons.apache.org/proper/commons-io/

Edit:
Metoda powinna nazywać się "zipFolder" albo coś w ten deseń, a nie "readByteArrFromFile". Nazwa metody jest kompletną porażką. Dopiero po przeczytaniu ciała metody dowiedziałem się co ona tak naprawdę robi.

0

Zrobiłem ten test tak ale po konwersji z pliku na byte [] zwraca mi go w takiej formie B@ccf134. Jaki to jest format lub kodowanie.

@RunWith(SpringRunner.class)
@SpringBootTest
public class ByteArrFinderTest {

	private File folderTest;
	@Autowired
	private ByteArrFinder readByte;

	@Rule
	public TemporaryFolder folder = new TemporaryFolder();

	@Before
	public void before() throws IOException {
		folderTest = folder.newFolder("test");

	}

	@Test
	public void testConvertFileToByte() throws IOException {
		// Give
		File file = new File(folderTest.getAbsolutePath() + "/file.txt");
		FileUtils.writeByteArrayToFile(file, new byte[12]);
		File file2 = new File(folderTest.getAbsolutePath());
		// When
		byte [] result = readByte.convertFileToByte(file2);
		//Then
		assertEquals(file.length(), result);
		assertNotNull(result);
	
	}

}
0

Zrobiłem ten test tak ale po konwersji z pliku na byte [] zwraca mi go w takiej formie B@ccf134.

tablica.toString() na tablicach jest bezużyteczny, bo jest nienadpisany. Zwraca to samo co zwykły java.lang.Object czyli "getClass().toString" + '@' + <jakieś hexy>. Na przykład taki kod:

class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		System.out.println(new byte[12]);
	}
}

zwraca: [B@1540e19d
https://www.ideone.com/9RJNSx

Jeśli chcesz wyświetlić zawartość tablicy bajtów we w miarę czytelnej dla człowieka postaci to masz metody typu java.util.Arrays.toString(bytes)

0

Ja jeszcze kontrolnie zadam pytanie, co i po co tu testujesz? Co jeżeli zmieni się implementacja ZIPa w bibliotece i będzie dołączał dodatkowe informacje do pliku zip? Wtedy zmieni się długość pliku zip i test będzie failował.

1 użytkowników online, w tym zalogowanych: 0, gości: 1