2015-01-27 2 views
1

У меня есть класс с обычным методом и нативным методом, который я хотел бы издеваться:Mock нативного метода с тенью классом Robolectric Пользовательской

public class MyClass { 

    public int regularMethod() { ... } 
    public void native myNativeMethod(); 

} 

Я использую Robolectric, чтобы проверить мое приложение, и я я пытаюсь найти способ издеваться над этими методами, используя custom shadow class. Вот моя тень класс:

@Implements(MyClass.class) 
public class MyShadowClass { 

    @Implementation 
    public int regularMethod { return 0; } 

    @Implementation 
    public void nativeMethod { ... } 

} 

Вот мой тест:

@RunWith(RobolectricTestRunner.class) 
@Config(manifest = Config.NONE) 
public class MyTest { 

    @Test 
    @Config(shadows = { MyShadowClass.class }) 
    public void test() { 
    MyClass obj = new MyClass(); 
    Assert.assertEquals(obj.regularMethod(), 0); 
    } 

} 

Это не работает, как я думал. Издевательство над собственным методом может быть растянуто с классом Shadow, но я думал, что использование пользовательского теневого класса таким образом приведет к вызову кода теневого класса.

ответ

2

Я думаю robolectric не знает, что ваш класс должен быть затененными;)

Вот как сказать robolectric, что вы будете тень некоторые не андроид классы SDk.

public class MyRobolectricTestRunner extends RobolectricTestRunner { 

@Override 
protected ClassLoader createRobolectricClassLoader(Setup setup, SdkConfig sdkConfig) { 
    return super.createRobolectricClassLoader(new ExtraShadows(setup), sdkConfig); 
} 

class ExtraShadows extends Setup { 
    private Setup setup; 

    public ExtraShadows(Setup setup) { 
     this.setup = setup; 
    } 

    public boolean shouldInstrument(ClassInfo classInfo) { 
     boolean shouldInstrument = setup.shouldInstrument(classInfo); 
     return shouldInstrument 
       || classInfo.getName().equals(MyClass.class.getName()); 
    } 
} 
} 
+0

Является ли это по-прежнему верно в RoboElectric V3? –

+0

он не работает для версии 3. + –

0

Для robolectric 3. +:

Создание пользовательского тест бегун, который проходит 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(); 
    } 
} 
Смежные вопросы