Sì, se si sottoclasse il RobolectricTestRunner, aggiungi un pacchetto personalizzato al costruttore e carica le tue classi Shadow nel metodo bindShadowClasses. Non c'è bisogno di usare il trucco del pacchetto Android. *.
(Nota: questo è con robolectric-1,1)
Ci sono una serie di ganci forniti nel RobolectricTestRunner # setupApplicationState che è possibile ignorare.
Ecco la mia realizzazione del RobolectricTestRunner.
import org.junit.runners.model.InitializationError;
import com.android.testFramework.shadows.ShadowLoggerConfig;
import com.xtremelabs.robolectric.Robolectric;
import com.xtremelabs.robolectric.RobolectricTestRunner;
public class RoboRunner extends RobolectricTestRunner {
public RoboRunner(Class<?> clazz) throws InitializationError {
super(clazz);
addClassOrPackageToInstrument("package.you're.creating.shadows.of");
}
@Override
protected void bindShadowClasses() {
super.bindShadowClasses(); // as you can see below, you really don't need this
Robolectric.bindShadowClass(ShadowClass.class);
}
}
Più metodi che è possibile creare una sottoclasse (da RobolectricTestRunner.class)
/**
* Override this method to bind your own shadow classes
*/
protected void bindShadowClasses() {
}
/**
* Override this method to reset the state of static members before each test.
*/
protected void resetStaticState() {
}
/**
* Override this method if you want to provide your own implementation of Application.
* <p/>
* This method attempts to instantiate an application instance as specified by the AndroidManifest.xml.
*
* @return An instance of the Application class specified by the ApplicationManifest.xml or an instance of
* Application if not specified.
*/
protected Application createApplication() {
return new ApplicationResolver(robolectricConfig).resolveApplication();
}
Ecco dove si chiamano nel Robolectric TestRunner:
public void setupApplicationState(final RobolectricConfig robolectricConfig) {
setupLogging();
ResourceLoader resourceLoader = createResourceLoader(robolectricConfig);
Robolectric.bindDefaultShadowClasses();
bindShadowClasses();
resourceLoader.setLayoutQualifierSearchPath();
Robolectric.resetStaticState();
resetStaticState();
DatabaseConfig.setDatabaseMap(this.databaseMap);//Set static DatabaseMap in DBConfig
Robolectric.application = ShadowApplication.bind(createApplication(), resourceLoader);
}
Grazie per la spiegazione. Il motivo per cui voglio oscurare la mia attività è perché viene lanciato dalla mia applicazione con una chiamata a 'startActivityForResult (..)'. Ho questo codice: 'ShadowActivity shadowActivity = shadowOf (activityA); \t \t Intent startedIntent = shadowActivity.getNextStartedActivity(); \t \t ShadowIntent shadowIntent = shadowOf (startedIntent); \t \t assertThat (shadowIntent.getComponent(). GetClassName(), equalTo (activityB.class.getName())); 'Voglio ottenere le visualizzazioni dall'attivitàB. Usando l'API nativa, ho usato un 'ActivityMonitor' ma voglio sapere come farlo usando Robolectric. – kaneda