2015-05-28 1 views
0

При использовании Robolectric 2.4 мы могли бы определить наш testRunner для получения нашего AndroidManifest и определить наш getTargetSdkVersion в качестве кода ниже.Как определить TargetSDK в TestRunner Robolectric 3.0

@Override 
protected AndroidManifest getAppManifest(Config config) { 
    return new AndroidManifest(Fs.fileFromPath(MANIFEST_PROPERTY), Fs 
      .fileFromPath(RES_PROPERTY)) { 

     @Override 
     public int getTargetSdkVersion() { 
      return TARGET_SDK_VERSION; 
     } 
    }; 
} 

В Robolectric 3.0, это была изменена, мы определяем получение AndroidManifest, как показано ниже

@Override 
protected AndroidManifest getAppManifest(Config config) { 
    return createAppManifest(Fs.fileFromPath(MANIFEST_PROPERTY), Fs.fileFromPath(RES_PROPERTY), Fs.fileFromPath(ASSET_PROPERTY)); 

} 

Это хорошо. Но теперь, как я могу установить getTargetSdkVersion в Robolectric 3.0 сейчас? Обратите внимание, что в Android Studio мы не определяем TargetSdkVersion в AndroidManifest. В настоящее время я использую @Config, чтобы обойти это, но хотел бы поместить все в класс TestRunner.

ответ

1

Попробуйте

@RunWith(RobolectricGradleTestRunner.class) 
@Config(sdk = 18) // Here you can change the SDK version 
public class MyClassTest ... { 

    @Test 
    public void testSomething() { 
     // ... 
    } 
} 

Взято отсюда https://github.com/robolectric/robolectric/issues/1730

UPDATE

Так что я проверил о своем последнем комментарии, и я пришел с этим, я не думаю, это окончательный ответ, но я надеюсь, что, по крайней мере, это даст вам подсказку.

То, что я сделал, после прочтения кода Robolectric я нашел этот

@Override 
    protected AndroidManifest getAppManifest(Config config) { 
    // Logger.error("SDK VERSION " + config.sdk()); 

    Properties props = new Properties(); 
    props.setProperty("sdk", "5"); 
    Config c = Config.Implementation.fromProperties(props); 
    // Logger.error("SDK FROM PROPERTIES " + c.sdk()); 
    // Logger.error("SDK FROM PROPERTIES " + props.getProperty("sdk")); 
    return super.getAppManifest(config); 
} 

Все регистраторы работали и показать то, что я указал, но вот где я застрял. Так что я попытался перекрывая createAppManifest, чтобы увидеть, если изменения выше повлияло это или нет, но я не знаю, как запустить этот метод

@Override 
protected AndroidManifest createAppManifest(FsFile manifestFile, FsFile resDir, FsFile assetDir) { 
    AndroidManifest an = createAppManifest(manifestFile, resDir, assetDir); 
    // Logger.error("TARGET SDK VERSION" + an.getTargetSdkVersion()); 
    return an; 
} 

Это весьма некрасиво и Hacky, есть должно быть лучшим решением. Если вы спросите в списке рассылки robolectric, вы можете получить лучший ответ.

К сожалению:/

+0

Спасибо Эрик. Это то, что я уже делаю, как упоминалось выше. «В настоящее время я использую @Config для обхода этого, но хотел бы поместить все в класс TestRunner». – Elye

+0

Мне очень жаль, я полностью пропустил эту часть. Я обновил свой ответ. Я пробовал несколько вещей, но я не знаю, как проверить, работает ли это или нет (это не провалилось, но я не знаю, как это проверить: P) –

+0

В любом случае, если вы найдете ответ, поделитесь им , –

1

Я сделал некоторые исследования, и мне удалось решить эту проблему с переопределение() метод getConfigProperties. Попробуйте это:

public class CustomTestRunner extends RobolectricTestRunner { 

    private static final String MANIFEST = "src/main/AndroidManifest.xml"; 
    private static final String SDK = "18"; 

    public CustomTestRunner(Class<?> testClass) throws InitializationError { 
     super(testClass); 
    } 

    @Override 
    protected Properties getConfigProperties() { 
     Properties properties = new Properties(); 

     properties.setProperty("manifest", MANIFEST); 
     properties.setProperty("sdk", SDK); 
     return properties; 
    } 
} 
0

Вы можете переопределить метод pickSdkVersion в пользовательских RobolectricTestRunner.

 Смежные вопросы

  • Нет связанных вопросов^_^