Prueba de la excepción ClassNotFound
Estoy tratando de probar que una clase no se encuentra con UnitTest en Android.
Que esta pasando:
1. Estoy escribiendo una biblioteca android con dependencias transitive
que se resuelven en la aplicación host
2. El desarrollador puede eliminar algunas dependencias, por ejemplo, quitar todos los com.example.package
3. Tengo una Fábrica que intentará instanciar (usando la reflexión) un Objeto y atrapar el ClassNotFoundException
. Si el desarrollador elimina las dependencias, se debe lanzar la excepción.
4. Quiero probar este caso, pero todo lo que encontré es problema con las dependencias, no cómo probarlo.
- ¿Es una prueba UNIT o una prueba de integración?
- Pruebas de unidades de Android que requieren contexto
- Adaptador RecyclerView en la prueba de unidad
- Problemas con la ejecución de pruebas de unidad de actividad de Android desde Eclipse
- Mockito - ¿Qué hace el método de verificación?
Ejemplo de código que quiero probar
try { sNetworkResponseBuilderClass = OkHttpNetworkResponse.Builder.class; } catch (Exception e){ // <<<< I want to test this case new ClassNotFoundException("Unable to find OkHttpNetworkResponse.Builder.class").printStackTrace(); return null; }
Biblioteca utilizada: hamcrast, mockito, JUnit 4.
¿Sabes como hacerlo?
- IllegalStateException en Android Support al ejecutar pruebas de unidad
- Configuración de la prueba de unidad para varios módulos
- Prueba de unidad de Android: ActivityMonitor waitForActivityWithTimeout devuelve NULL, getActivity nunca devuelve, error de permiso de INJECT_EVENTS
- Cómo generar informes de pruebas de Android en HTML automáticamente
- Unidad Método de prueba que no contiene lambda expresión Android Studio
- Cómo emular onLowMemory ()?
- ¿Cómo probar un AlertDialog en Android?
- La falla de Android ActivityMonitor hace que getActivity () nunca vuelva
Así que para mí lo primero que tienes que hacer es extraer la parte del código que puede lanzar un ClassNotFoundException
con el fin de poder burlarse fácilmente, algo así como:
public Class<? extends NetworkResponseBuilder> getNetworkResponseBuilderClass() throws ClassNotFoundException { // Your logic here }
A continuación, puede probar una instancia de fábrica real utilizando Mockito.spy
para poder redefinir el comportamiento del método getNetworkResponseBuilderClass()
como siguiente:
public void testFactoryIfNetworkResponseBuilderNotFound() { Factory factory = spy(new Factory()); when(factory.getNetworkResponseBuilderClass()).thenThrow( new ClassNotFoundException() ); // The rest of your test here } public void testFactoryIfNetworkResponseBuilderFound() { Factory factory = spy(new Factory()); when(factory.getNetworkResponseBuilderClass()).thenReturn( OkHttpNetworkResponse.Builder.class ); // The rest of your test here }
Más detalles sobre Mockito.spy .
No estoy seguro de si he entendido correctamente tu pregunta, pero puedes consultar con JUnit si se produce una excepción:
@Test(expected=ClassNotFoundException.class) public void testClassNotFoundException() { // a case where the exception gets thrown }
OkHttpNetworkResponse.Builder puede ser como sigue:
package com.example.model; public class OkHttpNetworkResponse { public static class Builder { } }
- Tengo una fábrica que intentará instanciar (usando la reflexión) un objeto y coger la excepción de ClassNotFoundException. Si el desarrollador elimina las dependencias, se debe lanzar la excepción.
Clase de fábrica: que creará cualquier objeto podría ser como sigue:
package com.example.factory; public class Factory { public static Object getInstance(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException { Class clazz = Class.forName(className); return clazz.newInstance(); } }
- El desarrollador puede eliminar algunas dependencias, por ejemplo, quitar todos los com.example.package
- Quiero probar este caso, pero todo lo que encontré es problema con las dependencias, no cómo probarlo.
FactoryTest Class: que pondrá a prueba si ClassNotFoundException es lanzado o no puede ser como sigue: Nota: por favor, verifique los comentarios con cuidado.
package com.example.factory; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import org.junit.Test; public class FactoryTest { Factory factory; @Test(expected=ClassNotFoundException.class) public void test() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException { ClassLoader loader = FactoryTest.class.getClassLoader(); String directory = loader.getResource(".").getPath() + "/com/example/model"; File dir = new File(directory); //Checking directory already existed or not.. assertTrue("Directory:"+dir.getPath()+" not exist",dir.exists()); //Deleting directory deleteDirectoryProgramatically(directory); //Checking directory already deleted or not.. assertFalse("Directory:"+dir.getPath()+" still exist",dir.exists()); //Now getInstance Method will throw ClassNotFoundException because OkHttpNetworkResponse.Builder.class has been deleted programatically. Factory.getInstance("OkHttpNetworkResponse.Builder.class"); } private void deleteDirectoryProgramatically(String directory) { File dir = new File(directory); System.out.println(dir.getAbsolutePath()); String[] files = dir.list(); for (String f : files) { File fl = new File(directory,f); System.out.println(f+ " deleted?"+fl.delete()); } System.out.println(dir+ " deleted?"+dir.delete()); } }
Es una cuestión muy simple. JUnit4 prueba de unidad de excepción se da a continuación con un ejemplo. Espero que te aclare.
MyNumber.java
public class MyNumber { int number; public MyNumber div(MyNumber rhs) { if (rhs.number == 0) throw new IllegalArgumentException("Cannot divide by 0!"); this.number /= rhs.number; return this; } }
MyNumberTest.java
public class MyNumberTest { private MyNumber number1, number2; // Test fixtures @Test(expected = IllegalArgumentException.class) public void testDivByZero() { System.out.println("Run @Test testDivByZero"); // for illustration number2.setNumber(0); number1.div(number2); } }
JUnit – Prueba de Excepciones
Para probar si el código lanza una excepción deseada, utilice la anotación @Test(expected = exception.class)
, como se ilustra en el ejemplo anterior. Para su caso será
/** * Check for class not found exception **/ @Test(expected=ClassNotFoundException.class) public void testClassNotFoundException() { ..... }
Para una mejor comprensión, puede ir a través de este tutorial: Java Unit Testing – JUnit & TestNG . Contiene el ejemplo de código de ejecución completo paso a paso con la explicación.
Dentro de la captura puede comprobar el objeto con el operador instanceof como:
try { sNetworkResponseBuilderClass = OkHttpNetworkResponse.Builder.class; } catch (Exception e){ if(e instanceof ClassNotFoundException){ // here you can do the code you want in case of ClassNotFoundException thrown } }
Es tu problema de diccionario. En su diccionario en la clase de prueba no tendrá. Cambiar su diccionario.
Utilice Class.forName ("com.example.ClassName")
try { Class.forName("com.example.OkHttpNetworkResponse.Builder"); } catch (ClassNotFoundException e) { // This class was not found }
Vea Class.forName (String className)
- ¿Hay una biblioteca de diseño / overlay / showcase de Android Material Design onboarding / tutorial?
- Android inventory.getSkuDetails () devolviendo null