2017-10-05 3 views
0

Je suis nouveau dans le test de mockito, j'ai essayé de suivre les blogs, mais c'est assez brouillé pour l'instant.Mockito pour l'environnement getExternalStorageState() android

La devise est de tester deux fonctions statiques dans la classe FileUtility. Le code va ci-dessous. Comment dois-je écrire le cas de test unitaire pour tester cette fonction pour des entrées comme "fileName = null"?

S'il vous plaît partager un peu de lumière/code à l'intérieur.

+0

Vous ne pouvez pas tester les fonctions statiques avec mockito. Essayez d'utiliser PowerMock –

Répondre

1

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.
+0

Je souhaite que je pourrais vous donner plus d'étoiles ou quelque chose plutôt que d'un upvote. La réponse était très efficace. J'ai fait quelques changements en testant, appris de votre explication – Vansi