Intereting Posts
Данные многостраничной формы POST с использованием Retrofit 2.0, включая изображение Будет ли новый API ActionBar включен в бэкпорт Fragment? Ошибка установки: Неизвестная ошибка Android-приложения Идентификатор ресурса не найден для атрибута 'showAsAction' в пакете 'android' Android Google Maps Регистрация не работает, и он говорит, что введенный MD5-сертификат не действителен Уменьшает ли Android скорость загрузки при выключении экрана? Android не может открыть файл с помощью LibGDX Как запустить бесконечный цикл в Android без замораживания пользовательского интерфейса? Не удалось автоматизировать Android UI-Tests на Jenkins-Server из-за сложных зависимостей lib-проекта от основного проекта (ов) Сохранить перечисление в SharedPreference Текст для шатра динамически Перенаправить содержимое файла с android на компьютер Com.android.build.transform.api.TransformException с Android-сервисами google play Как экспортировать векторные векторные чертежи Android XML в другой формат? Android recyclerView findViewHolderForAdapterPosition возвращает null

Как создать пользовательские тени в robolectric 3.0?

Мне нужно высмеять некоторый пользовательский класс (создайте для него тень). Я уже читал на http://robolectric.org/custom-shadows/, как это сделать.

Поэтому у меня есть класс:

public class MyClass { public static int regularMethod() { return 1; } } 

Я создаю тень:

 @Implements(MyClass.class) public class MyShadowClass { @Implementation public static int regularMethod() { return 2; } } 

И я установил тень в Test-классе:

 @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, shadows={MyShadowClass.class}) public class MyTest { @Test public void testShadow() { assertEquals(2, MyClass.regularMethod()); } } 

Но тень не используется.

 java.lang.AssertionError: Expected :2 Actual :1 

Как сделать пользовательскую тень видимой для RobolectricGradleTestRunner?

Я уже пробовал:

  1. http://www.codinguser.com/2015/06/how-to-create-shadow-classes-in-robolectric-3/
  2. https://github.com/jiahaoliuliu/RobolectricSample/blob/master/app-tests/src/main/java/com/jiahaoliuliu/robolectricsample/RobolectricGradleTestRunner.java
  3. Mock собственный метод с Robolectric Пользовательский теневой класс

Но я получаю различные ошибки компиляции, такие как

  • InstrumentingClassLoaderConfig не найден
  • Setup не найдена

Как правильно использовать пользовательские тени в robolectric 3.0 ?

Solutions Collecting From Web of "Как создать пользовательские тени в robolectric 3.0?"

Пользовательских теней следует избегать и должен быть последним курортом. Его следует использовать только в том случае, если вы не можете сделать много рефакторинга в своем коде, что мешает вам запускать тесты, как вызов собственного метода. Лучше высмеивать объект этого класса или шпиона, используя powermock или mockito, чем пользовательский тень. Если это статический метод, то используйте powermock.

В нашем проекте у нас был класс, который имел некоторые собственные методы, и это был класс конфигурации, используемый везде в приложении. Поэтому мы переместили собственные методы в другой класс и затеняли это. Эти собственные методы не выполняли тестовые примеры.

В любом случае, вот как вы можете настраивать тень в robolectric 3.0:

Создайте собственный тестовый бегун, который расширяет RobolectricGradleTestRunner:

 public class CustomRobolectricTestRunner extends RobolectricGradleTestRunner { public CustomRobolectricTestRunner(Class<?> klass) throws InitializationError { super(klass); } public InstrumentationConfiguration createClassLoaderConfig() { InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder(); builder.addInstrumentedPackage("com.yourClassPackage"); return builder.build(); } 

Убедитесь, что пакет не содержит тестовых примеров, которые вы используете с помощью robolectric.

Я Jiahao, создатель второго репозитория, о котором вы говорите.

Прежде всего, спасибо за проверку кода. Я делаю много исследований на Android, и я рад, что мое исследование полезно для кого-то другого.

Затем, Тень о Robolectric. Я использую Robolectric 3.1 в этом проекте, чтобы проверить, как Robolectric 3 работает с MarshMallow: https://github.com/jiahaoliuliu/robolectricForMarshmallow

Я тестировал новый диспетчер разрешений времени выполнения, а также отслеживал приложение и действия.

Вот пример кода теневой активности:

 import android.content.Context; import com.jiahaoliuliu.robolectricformarshmallow.controller.MainController; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; /** * Created by Jiahao on 7/18/16. */ @Implements(MainController.class) public class MainControllerShadow { public void __constructor__ (Context context) { // Not do anything } @Implementation public String getTextToDisplay(boolean permissionGranted) { return "Test"; } } 

https://github.com/jiahaoliuliu/robolectricForMarshmallow/blob/master/app/src/test/java/com/jiahaoliuliu/robolectricformarshmallow/shadow/MainControllerShadow.java

И вот как я использую его в модульном тесте:

Пакет com.jiahaoliuliu.robolectricformarshmallow;

 import com.jiahaoliuliu.robolectricformarshmallow.shadow.MainControllerShadow; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.annotation.Config; import static org.junit.Assert.*; /** * Created by Jiahao on 6/30/16. */ @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, manifest = Config.NONE, application = FoolApplication.class, shadows = { MainControllerShadow.class}, sdk = 18) public class MainActivityTest { private MainActivity mMainActivity; @Before public void setUp() throws Exception { mMainActivity = Robolectric.setupActivity(MainActivity.class); } @After public void tearDown() throws Exception { } @Test public void testOnCreate() throws Exception { // Simple test to know that it works assertTrue(true); } } 

https://github.com/jiahaoliuliu/robolectricForMarshmallow/blob/master/app/src/test/java/com/jiahaoliuliu/robolectricformarshmallow/MainActivityTest.java

Как вы можете видеть, я не использую индивидуальный тест-драйв Gradle Test Runner. Я проверил исходный код Robolectric, для версий 3.0 и 3.1 (последний) достаточно, чтобы просто указать теневые классы в заголовке.

Я надеюсь, что это помогает