【问题标题】:Mock native method with a Robolectric Custom shadow class使用 Robolectric 自定义阴影类模拟本机方法
【发布时间】:2015-01-27 23:20:10
【问题描述】:

我有一个包含常规方法和本地方法的类,我想模拟:

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 类的延伸,但我认为以这种方式使用自定义影子类会导致调用影子类代码。

【问题讨论】:

    标签: class mocking shadow robolectric


    【解决方案1】:

    我猜 robolectric 不知道你的班级应该被遮蔽;)

    这里是告诉 robolectric 你会影响一些非 android 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());
        }
    }
    }
    

    【讨论】:

    • 在 RoboElectric V3 中仍然如此吗?
    【解决方案2】:

    对于 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多