Cómo realizar una prueba de unidad

Estoy tratando de integrar casos de prueba de unidad para cada trozo de código posible. Pero me enfrento a problemas al agregar casos de prueba para llamadas api que se realizan a través de retroadaptación.

El compilador JUnit nunca ejecuta el código en las funciones CallBack .

Hay otra opción de hacer todas las llamadas api síncrono para fines de prueba, pero eso no es posible para todos los casos en mi aplicación.

¿Puede alguien por favor ayudarme a solucionar esto. Tengo que añadir casos de prueba en las llamadas api por cualquier medio.

Cualquier sugerencia para otro enfoque también será útil.

¡Gracias por adelantado!

Pruebo mis devoluciones de Retrofit usando las bibliotecas Mockito, Robolectric y Hamcrest.

En primer lugar, configure lib stack en el build.gradle de su módulo:

dependencies { testCompile 'org.robolectric:robolectric:3.0' testCompile "org.mockito:mockito-core:1.10.19" androidTestCompile 'org.hamcrest:hamcrest-library:1.1' } 

En la compilación global del proyecto jour, agregue la siguiente línea a las dependencias de buildscript:

 classpath 'org.robolectric:robolectric-gradle-plugin:1.0.1' 

A continuación, ingrese al menú "Build Variants" en Android Studio (para encontrarlo rápidamente, presione Ctrl + Mayús + A y busqué) y cambie la opción "Prueba de artefacto" a "Pruebas de unidad". Android studio cambiará su carpeta de prueba a "com.your.package (test)" (en lugar de androidTest).

De acuerdo. ¡La puesta en marcha está lista, tiempo para escribir algunas pruebas!

Supongamos que tiene algunas llamadas de api de retrofit para recuperar una lista de objetos que necesitan ser puestos en algún adaptador para un RecyclerView, etc. Nos gustaría probar si el adaptador se llena con los elementos adecuados en la llamada correcta. Para ello, tendremos que cambiar la implementación de la interfaz de Retrofit, que se utiliza para realizar llamadas con un simulacro, y hacer algunas respuestas falsas aprovechando la clase de ArgumentCaptor de Mockito.

 @Config(constants = BuildConfig.class, sdk = 21, manifest = "app/src/main/AndroidManifest.xml") @RunWith(RobolectricGradleTestRunner.class) public class RetrofitCallTest { private MainActivity mainActivity; @Mock private RetrofitApi mockRetrofitApiImpl; @Captor private ArgumentCaptor<Callback<List<YourObject>>> callbackArgumentCaptor; @Before public void setUp() { MockitoAnnotations.initMocks(this); ActivityController<MainActivity> controller = Robolectric.buildActivity(MainActivity.class); mainActivity = controller.get(); // then we need to swap the retrofit api impl. with a mock one // I usually store my retrofit api impl as a static singleton in class RestClient, hence: RestClient.setApi(mockRetrofitApiImpl); controller.create(); } @Test public void shouldFillAdapter() throws Exception { Mockito.verify(mockRetrofitApiImpl) .getYourObject(callbackAgrumentCaptor.capture()); int objectsQuantity = 10; List<YourObject> list = new ArrayList<YourObject>; for(int i = 0; i < objectsQuantity; ++i) { list.add(new YourObject()); } callbackArgumentCaptor.getValue().success(list, null); YourAdapter yourAdapter = mainActivity.getAdapter(); // obtain adapter // simple test check if adapter has as many items as put into response assertThat(yourAdapter.getItemCount(), equalTo(objectsQuantity)); } } 

Proceda con la prueba haciendo clic derecho en la clase de prueba y pulsando ejecutar.

Y eso es. Sugiero fuertemente el uso de Robolectric (con robolectric gradle plugin) y Mockito, estas libs hacen probar las aplicaciones de Android mucho más fácil. He aprendido este método de la siguiente entrada del blog . También, refiérase a esta respuesta .

Actualización : Si estás usando Retrofit con RxJava, mira mi otra respuesta en eso también.

Si utiliza .execute () en lugar de .enqueue () hace que la ejecución sea sincronizada, por lo que las pruebas pueden ejecutarse correctamente sin necesidad de importar 3 bibliotecas diferentes y agregar cualquier código o modificar las variantes de construcción.

Me gusta:

 public class LoginAPITest { @Test public void login_Success() { APIEndpoints apiEndpoints = RetrofitHelper.getTesterInstance().create(APIEndpoints.class); Call<AuthResponse> call = apiEndpoints.postLogin(); try { //Magic is here at .execute() instead of .enqueue() Response<AuthResponse> response = call.execute(); AuthResponse authResponse = response.body(); assertTrue(response.isSuccessful() && authResponse.getBearer().startsWith("TestBearer")); } catch (IOException e) { e.printStackTrace(); } } } 
  • La manera más rápida de crear una actividad simulada para probar
  • ¿Cuál es el propósito de las anotaciones de @SmallTest, @MediumTest y @LargeTest en Android?
  • ¿Diferencia entre la prueba de instrumentación de Android y la prueba de unidad en Android Studio?
  • Prueba de una clase Fragment en aislamiento usando Mockito
  • Cómo burlar un objeto de etiqueta NFC de Android para las pruebas de unidad
  • Habilitar ubicaciones de Mock en Android Marshmallow
  • VerifyError al ejecutar jUnit Test en Android 1.6
  • La API de Android Drive startResolutionForResult devuelve RESULT_CANCELLED
  • Prácticas recomendadas para la prueba de unidades de Android?
  • Cómo probar el archivo java generado automáticamente usando JUnit para mi AIDL
  • Android prueba testPreconditions
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.