Il semble qu'il y ait trois voies principales par getLogFilePath()
:
- Si le stockage externe est accessible en écriture et le stockage externe répertoire public est disponible, utilisez-
- Si le stockage externe est accessible en écriture et le public de stockage externe répertoire est pas disponible, mais le répertoire de stockage externe est disponible, utilisez-le
- Dans tous les autres cas, utilisez le répertoire de données
ces cas de test d'écriture implique seulement quelques attentes chinés sur les méthodes suivantes:
Environment.getExternalStorageState()
Environment.getExternalStoragePublicDirectory()
Environment.getExternalStorageDirectory()
Environment.getDataDirectory()
Voici un exemple:
// this test case need to mock static methods so it uses PowerMock
@RunWith(PowerMockRunner.class)
// this static methods to be mocked are on Environment so that must be 'prepared'
@PrepareForTest({Environment.class})
public class StorageUtilsTest {
@Rule
public TemporaryFolder storageDirectory = new TemporaryFolder();
private File nonExistentDirectory;
private File existentDirectory;
@Before
public void setup() {
nonExistentDirectory = Mockito.mock(File.class);
Mockito.when(nonExistentDirectory.exists()).thenReturn(false);
existentDirectory = storageDirectory.getRoot();
PowerMockito.mockStatic(Environment.class);
}
@Test
public void willUseTheExternalStoragePublicDirectoryWhenItIsAvailable() {
// external storage is writeable
Mockito.when(Environment.getExternalStorageState()).thenReturn(Environment.MEDIA_MOUNTED);
// the external storage public directory is available
Mockito.when(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)).thenReturn(existentDirectory);
String fileName = "someFileName";
String logFilePath = StorageUtils.getLogFilePath(fileName);
Assert.assertEquals(existentDirectory.getAbsolutePath() + File.separator + fileName, logFilePath);
}
@Test
public void willUseTheExternalStorageDirectoryWhenItIsAvailable() {
// external storage is writeable
Mockito.when(Environment.getExternalStorageState()).thenReturn(Environment.MEDIA_MOUNTED);
// the external storage public directory is not available
Mockito.when(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)).thenReturn(nonExistentDirectory);
// the external storage directory is available
Mockito.when(Environment.getExternalStorageDirectory()).thenReturn(existentDirectory);
String fileName = "someFileName";
String logFilePath = StorageUtils.getLogFilePath(fileName);
Assert.assertEquals(existentDirectory.getAbsolutePath() + File.separator + fileName, logFilePath);
}
@Test
public void willUseTheDataDirectoryWhenExternalStorageIsNotWriteable() {
// external storage is not writeable
Mockito.when(Environment.getExternalStorageState()).thenReturn("not media mounted");
// the data directory is available
Mockito.when(Environment.getDataDirectory()).thenReturn(existentDirectory);
String fileName = "someFileName";
String logFilePath = StorageUtils.getLogFilePath(fileName);
Assert.assertEquals(existentDirectory.getAbsolutePath() + File.separator + fileName, logFilePath);
}
@Test
public void willUseTheDataDirectoryWhenNothingElseIsAvailable() {
// external storage is writeable
Mockito.when(Environment.getExternalStorageState()).thenReturn(Environment.MEDIA_MOUNTED);
// but neither of the external storage directories are available
Mockito.when(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)).thenReturn(nonExistentDirectory);
Mockito.when(Environment.getExternalStorageDirectory()).thenReturn(nonExistentDirectory);
// so we must fall through to the data directory
Mockito.when(Environment.getDataDirectory()).thenReturn(existentDirectory);
String fileName = "someFileName";
String logFilePath = StorageUtils.getLogFilePath(fileName);
Assert.assertEquals(existentDirectory.getAbsolutePath() + File.separator + fileName, logFilePath);
}
@Test
public void doesSomethingWhenGivenANullFileName() {
// external storage is writeable
Mockito.when(Environment.getExternalStorageState()).thenReturn(Environment.MEDIA_MOUNTED);
// the external storage public directory is available
Mockito.when(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)).thenReturn(existentDirectory);
String logFilePath = StorageUtils.getLogFilePath(null);
// the assertion here will depend on what your getAbsoluteFilePath() method does with a null file name!
Assert.assertEquals(existentDirectory.getAbsolutePath() + File.separator, logFilePath);
}
}
Notes:
- Il utilise JUnit TemporaryFolder la règle pour créer (et jeter à la fin) un répertoire pour les assertions. Cela pourrait également être implémenté en utilisant une instance
File
mockée.
L'OP ne comprenait pas une définition de getAbsoluteFilePath()
donc je présume que c'était quelque chose comme ceci:
private static String getAbsoluteFilePath(File file, String fileName) {
return file.getAbsolutePath() + File.separator + fileName;
}
- L'exemple ci-dessus ne vise pas à être exhaustif, il vise à fournir juste assez pour que vous pouvez comprendre comment cela fonctionne et comment tester des méthodes statiques, etc.
Vous ne pouvez pas tester les fonctions statiques avec mockito. Essayez d'utiliser PowerMock –