new - ¿Cómo escribo una prueba de JUnit de Android cuando mi actividad se basa en extras pasados a través de un Intent?
intent call android (2)
La clase que heredas, ActivityInstrumentationTestCase2
, te permite simular un Intent
. De la documentation :
Puede inyectar intenciones personalizadas en su actividad (consulte setActivityIntent (intento)).
La documentación para setActivityIntent () aclara aún más:
Llame a este método antes de la primera llamada a getActivity () para inyectar un Intent personalizado en la Actividad bajo prueba.
Si no llama a esto, se proporcionará la intención por defecto. Si llama a esto después de que se haya iniciado su actividad, no tendrá ningún efecto.
Por lo tanto, debería poder realizar una llamada a este método dentro de su setUp()
antes de su llamada a getActivity()
. Puedes pasar un Intento simulado a setActivityIntent como mencionaste, solo crea un Intento falso con extras que esperas que la Actividad vea.
Estoy escribiendo una prueba de Android Junit para una clase que se basa en los extras que se le pasan a través de un Intent. Pude hacer que la clase funcionara correctamente, pero aún me gustaría saber cómo escribir una prueba de unidad para esa clase, ya que la prueba aún falla.
public class AddClassEvent extends Activity{
private String eventType;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle extras = getIntent().getExtras();
final String cNo = extras.getString("CourseNum");
// create a model instance
final StudentDBModel model = new StudentDBModel(this);
setContentView(R.layout.add_class_event);
.....
.....
}
}
La clase de prueba se parece a ...
public class AddClassEventTest extends ActivityInstrumentationTestCase2<AddClassEvent>{
private StudentDBModel model = null;
private RenamingDelegatingContext context = null;
public AddClassEventTest() {
super("com.UI", AddClassEvent.class);
}
/**
* This method is called before each test.
*/
@Override
public void setUp() {
context = new RenamingDelegatingContext(getActivity(), "test_");
model = new StudentDBModel(context);
}
/*
* This function will test addNewClassEvent() from StudentDBModel
*/
public void testAddNewClassEvent(){
ContentValues courseValues = new ContentValues();
courseValues.put("CourseId", "60-415");
courseValues.put("CourseName", "Advanced Database Design");
courseValues.put("Section", "1");
courseValues.put("Location", "Erie");
courseValues.put("Credit", "3");
courseValues.put("ProfEmail", "[email protected]");
courseValues.put("Website", "cs.uwindsor.ca");
model.addNewCourses(courseValues);
int numEventsBefore = model.getNumClassEvents();
ContentValues values = new ContentValues();
values.put("EventName", "Assignment 1");
values.put("CourseId", "60-415");
values.put("EventType", "Assignment");
values.put("EventWeight", "8");
values.put("DueDate", "10/20/2010");
model.addNewClassEvent(values);
int numEventsAfter = model.getNumClassEvents();
assertEquals(numEventsBefore + 1, numEventsAfter);
}
}
El problema es que el extra que estoy pasando a la clase AddClassEvent es un PK para mi DB que se crea en otra clase y se pasa a AddClassEvent a través de un Intent. Cada vez que ejecuto la prueba obtengo una excepción de puntero NULL en la línea:
final String cNo = extras.getString("CourseNum");
¿Cómo creo la información del extra en la prueba de Junit? ¿Hay alguna manera de hacer que esta prueba funcione? He buscado mucho y no puedo encontrar una respuesta. ¿Hay alguna manera de crear falsamente los extras en la prueba de Junit para que piense que está siendo creado por la otra clase? Si es así, ¿podría alguien mostrarme cómo?
OK, he intentado seguir su consejo y he cambiado mi función de configuración a:
@Override
public void setUp() {
context = new RenamingDelegatingContext(getActivity(), "test_");
model = new StudentDBModel(context);
Intent addEvent = new Intent();
addEvent.setClassName("com.UI", "com.UI.AddClassEvent");
addEvent.putExtra("CourseNum", "60-415");
setActivityIntent(addEvent);
getActivity();
}
pero todavía estoy recibiendo una excepción de puntero NULL. ¿Está mal mi sintaxis? ¿Alguna sugerencia?
OK, me di cuenta de mi error! El código para la configuración estaba en el orden equivocado. Debería verse como
@Override
public void setUp() {
Intent addEvent = new Intent();
addEvent.setClassName("com.UI", "com.UI.AddClassEvent");
addEvent.putExtra("CourseNum", "60-415");
setActivityIntent(addEvent);
context = new RenamingDelegatingContext(getActivity(), "test_");
model = new StudentDBModel(context);
}
Llamé a getActivity () dos veces y la primera llamada fue antes de la Intención. Al usar el orden correcto, la prueba funciona bien. Gracias por la ayuda de McStretch.