Questo problema di cui non riesco a liberarmi, ne ho provati probabilmente 3 o 4 dozzine articoli e discussioni cercando di risolverlo. Ho delineato tutto sotto.
Fondamentalmente la domanda è: il problema sta avendo un difetto con Robolectric? O c'è qualche piccolo passo che mi manca, o ho una strana combinazione di plugin. Qualsiasi consiglio su questo sarebbe molto apprezzato.
Windows 7 Versioni:
- Gradle 2.7
- Android 1.3.2 Studio
- Robolectric 3.0
- Roboguice 3. +
dipendenze del progetto:
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
classpath "com.newrelic.agent.android:agent-gradle-plugin:4.244.0"
classpath 'com.github.triplet.gradle:play-publisher:1.1.2'
classpath 'org.moallemi.gradle.advanced-build-version:gradle-plugin:1.5.0'
}
App Dipendenze
import org.moallemi.gradle.internal.VersionCodeType
apply plugin: 'com.android.application'
apply plugin: 'newrelic'
apply plugin: 'com.github.triplet.play'
apply plugin: 'org.moallemi.advanced-build-version'
android {
def SERVICE_ACCOUNT = “account”;
def P12_KEY = file('mykey.p12')
signingConfigs {
releaseConfig {
…
}
}
compileSdkVersion 22
buildToolsVersion '22.0.1'
advancedVersioning {
nameOptions {
versionMajor 6
versionMinor advancedVersioning.versionCode
}
codeOptions {
versionCodeType VersionCodeType.AUTO_INCREMENT_ONE_STEP
}
}
defaultConfig {
applicationId "com.my.app ="
minSdkVersion 15
targetSdkVersion 22
versionCode = advancedVersioning.versionCode
versionName = advancedVersioning.versionName
}
buildTypes {
def STRING = "String"
def URL = "URL"
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.releaseConfig
}
staging {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
development {
minifyEnabled false
}
debug {
minifyEnabled false
}
}
testOptions {
unitTests.returnDefaultValues = true
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.google.android.gms:play-services:4.2.+'
compile(name: 'library-release', ext: 'aar')
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.google.code.gson:gson:2.3.1'
compile 'org.roboguice:roboguice:3.+'
provided 'org.roboguice:roboblender:3.+'
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'
testCompile "org.robolectric:robolectric:3.0"
}
repositories {
flatDir {
dirs 'libs'
}
}
personalizzato Gradle Runner
public class M1stRoboelectricGradleTestRunner extends RobolectricTestRunner {
public M1stRoboelectricGradleTestRunner(Class<?> testClass) throws InitializationError {
super(testClass);
String buildVariant = (BuildConfig.FLAVOR.isEmpty()
? "" : BuildConfig.FLAVOR+ "/") + BuildConfig.BUILD_TYPE;
String intermediatesPath = BuildConfig.class.getResource("")
.toString().replace("file:", "");
intermediatesPath = intermediatesPath
.substring(0, intermediatesPath.indexOf("/classes"));
System.setProperty("android.package",
BuildConfig.APPLICATION_ID);
System.setProperty("android.manifest",
intermediatesPath + "/manifests/full/"
+ buildVariant + "/AndroidManifest.xml");
System.setProperty("android.resources",
intermediatesPath + "/res/merged/" + buildVariant);
System.setProperty("android.assets",
intermediatesPath + "/assets/" + buildVariant);
}
@Override protected AndroidManifest getAppManifest(Config config) {
String manifestProperty = System.getProperty("android.manifest");
String resProperty = System.getProperty("android.resources");
String assetsProperty = System.getProperty("android.assets");
AndroidManifest manifest = new AndroidManifest(Fs.fileFromPath(manifestProperty), Fs.fileFromPath(resProperty),
Fs.fileFromPath(assetsProperty)){
};
manifest.setPackageName("com.my.app");
return manifest;
}
}
Classe test
@RunWith(M1stRoboelectricGradleTestRunner.class)
public class MainActivityTest {
private MainActivity mActivity;
private Button mButton;
private TextView mTextView;
@Before
public void setup() {
mActivity = Robolectric.buildActivity(
MainActivity.class).create().get();
mButton = (Button) mActivity.findViewById(R.id.signInButton);
mTextView = (TextView) mActivity.findViewById(R.id.linkContact);
}
Problema: La seguente riga di codice è quello che sta gettando l'errore:
mActivity = Robolectric.buildActivity(
MainActivity.class).create().get();
Inizialmente, ho provato a utilizzare il robolectricGradleTestRunner predefinito ma ho continuato a ricevere ResourceNotFound com.my.app::string/app_name non trovato. Dopo aver esaminato una quantità ridicola di articoli e blog, mi sono imbattuto in this e sono riuscito a superarlo implementando un runner personalizzato. Questo ha risolto il problema con app_name, una specie di.
Se sulla classe di test ho messo @config (SDK = 21) ricevo l'errore che stavo ricevendo inizialmente:
android.content.res.Resources $ NotFoundException: nessuna etichetta come com. my.app:string/app_name su org.robolectric.util.ActivityController.getActivityTitle (ActivityController.java:104) su org.robolectric.util.ActivityController.attach (ActivityController.java:49) su org.robolectric.util .ActivityController $ 1.run (ActivityController.java:121) su org.robolectric.shadows.ShadowLooper.runPaused (ShadowLooper.java:304) a org.robolectric.shadows.CoreShadowsAdapter $ 2.runPaused (CoreShadowsAdapter.java:45) a org.robolectric.util.ActivityController.create (ActivityController.java:118) a org.robolectric.util.ActivityController.create (ActivityController .java: 129) a org.members1st.mobile.MainActivityTest.setup (MainActivityTest.java:32) a sun.reflect.NativeMethodAccessorImpl.invoke0 (metodo natale) a sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java: 62) presso sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) presso org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:50) in org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) in org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:47) a org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:24) a org.robolectric.RobolectricTestRunner $ 2.Valutare (RobolectricTestRunner.java:251) a org.robolectric.RobolectricTestRunner.runChild (RobolectricTestRunner .java: 188) a org.robolectric.RobolectricTestRunner.runChild (RobolectricTestRunner.java:54) a org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) a org.junit.runners.ParentRunner $ 1 .schedule (ParentRunner.java:71) presso org.junit.runners.ParentRunner.runC hildren (ParentRunner.java:288) presso org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) presso org.junit.runners.ParentRunner $ 2.valore (ParentRunner.java:268) presso org. robolectric.RobolectricTestRunner $ 1.evaluate (RobolectricTestRunner.java:152) a org.junit.runners.ParentRunner.run (ParentRunner.java:363) a org.junit.runner.JUnitCore.run (JUnitCore.java:137) a com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs (JUnit4IdeaTestRunner.java:78) a com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart (JUnitStarter.java:212) a com.intellij.rt.execution.junit .JUnitStarter.main (JUnitStarter.java:68) presso sun.reflect.NativeMethodAccessorImpl.invoke0 (metodo nativo) a sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) a com.intellij.rt.execution.application.AppMain.main (AppMain.java:140)
Se lascio solo l'SDK, ottengo robolectric non supporta API 22
Finora ho provato:
- Creazione di un costume BuildConfig e passaggio che in ogni raccomandazioni su this filo robolectric.
- Impostazione di packageName in @config per consigli su this thread.
- sovraccarico del nuovo ApplicationManifest per rispedire l'livello di API
- Impostazione del targetSdk a 21 nel mio Gradle presentare
- Praticamente ogni combinazione dei passaggi precedenti risultati nello stesso errore.
verificato che l'app_name si trova nel file di risorse values.xml generato dal test di costruire
Ho provato con
mActivity = Robolectric.setupActivity (MainActivity.class);
Invece di
mActivity = Robolectric.buildActivity(
MainActivity.class).create().get();
8. unit test regolari lavorano quando in esecuzione.
Suggerimento: prova a formattare correttamente la domanda e sposta la domanda in alto. – natario
Suggerimento eccezionale: qualche consiglio su quale sarebbe il modo migliore per esprimerlo? – aminner
È un errore di modifica o il tuo 'build.gradle' ha davvero' applicationId "com.my.app =" '? –