java - problem - noclassdeffounderror initialization failure
Prueba de excepción de ClassNotFound (7)
Así que, para mí, lo primero que debe hacer es extraer la parte del código que puede lanzar una ClassNotFoundException
para poder burlarse de él fácilmente, algo como:
public Class<? extends NetworkResponseBuilder> getNetworkResponseBuilderClass()
throws ClassNotFoundException {
// Your logic here
}
Luego, puede probar una instancia de fábrica real utilizando Mockito.spy
para poder redefinir el comportamiento del método getNetworkResponseBuilderClass()
siguiente manera:
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 .
Estoy intentando probar que no se encuentra una clase con UnitTest en Android.
Que esta pasando:
1. Estoy escribiendo una biblioteca de Android con dependencias transitive
que se resuelven en la aplicación host
2. El desarrollador puede eliminar algunas dependencias, por ejemplo, eliminar todo com.example.package
3. Tengo una fábrica que intentará crear una instancia (utilizando la reflexión) un objeto y capturar la ClassNotFoundException
. Si el desarrollador elimina las dependencias, se debe lanzar la excepción.
4. Quiero probar este caso, pero todo lo que encontré es un problema con las dependencias, no cómo probarlo.
Código de ejemplo 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?
Dentro de la captura puede verificar 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 clase de prueba no tendrá. cambia tu diccionario
Es un tema muy simple. Las pruebas de unidad de excepción JUnit4 se dan 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 arroja una excepción deseada, use la anotación @Test(expected = exception.class)
, como se ilustra en el ejemplo anterior. Para tu caso será
/**
* Check for class not found exception
**/
@Test(expected=ClassNotFoundException.class)
public void testClassNotFoundException() {
.....
}
Para una mejor comprensión, puede seguir este tutorial: Pruebas de unidades en Java - JUnit & TestNG . Contiene el ejemplo completo del código en ejecución paso a paso con explicación.
No estoy seguro de haber entendido tu pregunta correctamente, 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
}
Use Class.forName ("com.example.ClassName")
try {
Class.forName("com.example.OkHttpNetworkResponse.Builder");
} catch (ClassNotFoundException e) {
// This class was not found
}
OkHttpNetworkResponse.Builder podría ser el siguiente:
package com.example.model;
public class OkHttpNetworkResponse {
public static class Builder {
}
}
- Tengo una fábrica que intentará crear una instancia (utilizando la reflexión) de un objeto y capturar la excepción ClassNotFoundException. Si el desarrollador elimina las dependencias, se debe lanzar la excepción.
Clase de fábrica: lo que creará cualquier objeto podría ser el siguiente:
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, eliminar todo com.example.package
- Quiero probar este caso, pero todo lo que encontré es un problema con las dependencias, no cómo probarlo.
FactoryTest Class: que probará si ClassNotFoundException es lanzada o no podría ser la siguiente: NB: por favor revise los comentarios cuidadosamente.
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());
}
}