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.

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?

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 { } } 
  1. 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(); } } 
  1. El desarrollador puede eliminar algunas dependencias, por ejemplo, quitar todos los com.example.package
  2. 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)

  • Prueba de unidad de presentador con RxJava CompositeSubscription
  • ActivityInstrumentationTestCase2 vs ActivityTestRule
  • PowerMock en el proyecto Android
  • Android Espresso testing 'No se puede resolver el símbolo' InstrumentationRegistry ''
  • Acceso al contexto de la aplicación desde TestSuite en Setup () antes de llamar a getActivity ()
  • Ejecutar todas las pruebas de unidad en Android Studio
  • Cómo probar métodos de unidad que interactúan con clases de sistema (o Android)
  • Schedulers.immediate () no funciona con las pruebas de gradle de la línea de comandos
  • Pruebas Robolectric que se ejecutan en Android Studio pero no en la línea de comandos
  • No se puede verificar la llamada de método de simulación desde el suscriptor de RxJava
  • AsyncTask onPostExecute () no se llama en caso de prueba de unidad
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.