2016-03-30 3 views
2

Мне нужна помощь с блоком тестирования. Я хочу высмеять статический метод write(Path path, byte[] bytes, OpenOption... options)java.nio.file.Files класс.Любой способ издеваться над методом Files.write (...)?

Я пробовал например. таким образом:

PowerMockito.doReturn(path).when(Files.class, "write", path, someString.getBytes()); 

В этом случае метод не найден.

PowerMockito.doReturn(path).when(Files.class, PowerMockito.method(Files.class, "write", Path.class, byte[] 
      .class, OpenOption.class)); 

На этот раз у меня есть UnfinishedStubbingException.

Как я могу это исправить?

+3

Почему бы не использовать поддельную 'FileSystem', как вы должны? Издевательские статические методы уже являются основным запахом. –

+1

Seconding Louis - встроенные инструменты для файловой системы Java не подходят для насмешек даже при использовании таких инструментов, как PowerMockito, для ограничения ограничений Mockito. –

+0

Спасибо Луи. Я использовал способ, которым вы предложили, и я использовал библиотеку [this] (https://github.com/marschall/memoryfilesystem) для создания файловой системы в памяти. Это лучшее решение для меня. –

ответ

0

я имел только один сервис, который записывает в файловую систему, поэтому я решил использовать Mockito только:

import static org.mockito.Matchers.any; 
import static org.mockito.Matchers.anyString; 
import static org.mockito.Matchers.anyVararg; 
import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.when; 
import org.springframework.test.util.ReflectionTestUtils; 

Path mockPath = mock(Path.class); 
FileSystem mockFileSystem = mock(FileSystem.class); 
FileSystemProvider mockFileSystemProvider = mock(FileSystemProvider.class); 
OutputStream mockOutputStream = mock(OutputStream.class); 
when(mockPath.getFileSystem()).thenReturn(mockFileSystem); 
when(mockFileSystem.provider()).thenReturn(mockFileSystemProvider); 
when(mockFileSystemProvider.newOutputStream(any(Path.class), anyVararg())).thenReturn(mockOutputStream); 
when(mockFileSystem.getPath(anyString(), anyVararg())).thenReturn(mockPath); 

// using Spring helper, but could use Java reflection 
ReflectionTestUtils.setField(serviceToTest, "fileSystem", mockFileSystem); 

Просто убедитесь, что ваша служба выполняет следующие вызовы:

Path path = fileSystem.getPath("a", "b", "c"); 
Files.write(path, bytes);