2016-03-30 7 views
2

Ich brauche Hilfe mit der Einheit Testfall. Ich möchte statische Methode write(Path path, byte[] bytes, OpenOption... options) von java.nio.file.Files Klasse Mock.Jede Möglichkeit, die Files.write (...) -Methode zu überspielen?

Ich versuchte zB. auf diese Weise:

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

In diesem Fall wird die Methode nicht gefunden.

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

Diesmal habe ich UnfinishedStubbingException.

Wie kann ich es richtig machen?

+3

Warum nicht verwenden ein falsches 'FileSystem' so wie du es solltest? Verspottende statische Methoden sind bereits ein Hauptgeruch. –

+1

Seconding Louis - Javas eingebaute Dateisystem-Tools sind nicht gut zum Spotten, selbst wenn Sie Tools wie PowerMockito verwenden, um die Einschränkungen von Mockito zu übertreffen. –

+0

Danke Louis. Ich habe die von Ihnen vorgeschlagene Methode verwendet und diese [https://github.com/marschall/memoryfilesystem] -Bibliothek verwendet, um ein In-Memory-Dateisystem zu erstellen. Die bessere Lösung für mich. –

Antwort

0

Ich hatte nur einen Dienst, der auf das Dateisystem schreibt, so habe ich beschlossen, Mockito nur zu verwenden:

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); 

einfach Ihren Dienst stellen Sie sicher, die folgenden Aufrufe ausführt:

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