En realidad, necesito obtener una respuesta de una llamada a la API, para eso lo solicité Context
.
En realidad, necesito obtener una respuesta de una llamada a la API, para eso lo solicité Context
.
Respuestas:
Actualizar.
Solo use para la versión 1.xy 2.x:
Robolectric.application;
Y para la versión 3.x:
RuntimeEnvironment.application;
Y para la versión 4.x:
agregar a su build.gradle
archivo:
testImplementation 'androidx.test:core:1.0.0'
recuperar el contexto con:
ApplicationProvider.getApplicationContext()
RuntimeEnvironment.application
en código estático (como los métodos anotados con @BeforeClass
) ya que Robolectric probablemente no se inicializará en ese punto y el valor será null
.
Añadir
testImplementation "androidx.test:core-ktx:${deps.testrunner}"
Y use:
private val app = ApplicationProvider.getApplicationContext()
Para el último Robolectric 4.3 a partir de ahora en 2019 '
ShadowApplication.getInstance ()
y
Aplicación Roboletric.
Ambos están depricados. Entonces estoy usando
Context context = RuntimeEnvironment.systemContext;
para obtener el contexto.
Para obtener el contexto de la aplicación, debe hacer lo siguiente:
Esto me funciona con Robolectric 3.5.1: ShadowApplication.getInstance().applicationContext
RuntimeEnvironment.application
o RuntimeEnvironment.application.getApplicationContext()
si funciona para usted.
A partir del lanzamiento 4.0-alpha-3 del 21 de julio, eliminaron ShadowApplication.getApplicationContext()
. Siga RuntimeEnvironment.application.getApplicationContext()
para cualquier prueba anotada con @RunWith(RobolectricTestRunner::class)
.
Como acotación al margen, su guía actual tiene un ejemplo de cómo obtener recursos de cadena usando:
final Context context = RuntimeEnvironment.application;
(Tenga en cuenta que los javadocs para RuntimeEnvironment
y ShadowApplication
actualmente reflejan la versión 3.x no alfa).
En algunos casos, es posible que necesite el contexto de su aplicación en lugar del contexto predeterminado de Robolectris. Por ejemplo, si desea obtener el nombre de su paquete. Por defecto, Robolectric le devolverá el org.robolectric.default
nombre del paquete. Para obtener el nombre real de su paquete, haga lo siguiente:
build.gradle
testImplementation 'org.robolectric:robolectric:4.2.1'
Tu clase de prueba:
@RunWith(RobolectricTestRunner.class)
@Config( manifest="AndroidManifest.xml")
public class FooTest {
@Test
public void fooTestWithPackageName(){
Context context = ApplicationProvider.getApplicationContext();
System.out.println("My Real Package Name: " + context.getPackageName());
}
}
Asegúrese de que en su directorio de trabajo Run / Debug Configurations esté establecido en: $ MODULE_DIR $
Es más seguro usarlo en Robolectric.getShadowApplication()
lugar de usarlo Robolectric.application
directamente.
Robolectric.application
De acuerdo con las respuestas de @EugenMartynov y @rds ....
Se puede encontrar un ejemplo rápido en Volley-Marshmallow-Release
en NetworkImageViewTest.java
// mNIV = new NetworkImageView(Robolectric.application);
mNIV = new NetworkImageView(RuntimeEnvironment.application);
El enlace de Volley está disponible https://android.googlesource.com/platform/frameworks/volley/+/marshmallow-release
tienes que agregar dependencias en el módulo de volley en Android Studio como:
dependencies {
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'
testCompile 'org.robolectric:robolectric:3.1.2'
}
En su caso, creo que debería tener en cuenta lo que está probando. A veces, encontrarse con problemas de código no comprobable o código aparentemente no comprobable es una señal de que tal vez su código deba ser refactorizado.
Para una respuesta a una llamada de API, es posible que no desee probar la propia llamada de API. Puede que no sea necesario probar que es posible enviar / recibir información de cualquier servicio web arbitrario, sino que su código maneja y procesa su respuesta de la manera esperada.
En cuyo caso, sería mejor refactorizar el código que está intentando probar. Divida el análisis / manejo de respuestas en otra clase que acepte un simple String
y haga sus pruebas en esa clase inyectando respuestas de cadena de muestra.
Esto es más o menos siguiendo las ideas de Responsabilidad Única e Inversión de Dependencia (La S y D en SOLID )
Ok, sé que muchos otros dijeron esta respuesta antes y es posible que ya estén desactualizados
when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application);
when(mockApplication.getFilesDir()).thenReturn(RuntimeEnvironment.application.getFilesDir());
sharedPref = RuntimeEnvironment.application.getSharedPreferences(KEY_MY_PREF, Context.MODE_PRIVATE);
sut = new BundleManagerImpl(mockApplication,
processHtmlBundle, resultListener, sharedPref);
Obtuve nulo, porque la parte when () fue DESPUÉS de la inicialización de sut. Podría ayudar a algunos de ustedes.
tambien tengo el
@RunWith(CustomRobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
al comienzo de la clase
también
when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works