java – Robolectric shadow不工作

前端之家收集整理的这篇文章主要介绍了java – Robolectric shadow不工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图用Robolectric创建一个测试.我的目标是能够从自定义行为中替换一个类的功能(例如来自一个库,而不能修改代码).

我创建了这个小测试来模拟我想做的事情:

  1. @RunWith(RobolectricTestRunner.class)
  2. @Config(shadows = {ShadowMessenger.class})
  3. public class TestShadow {
  4.  
  5. @Test
  6. public void testMessenger() {
  7. OriginalMessenger messenger = new OriginalMessenger();
  8. String message = messenger.getMessage();
  9. Assert.assertEquals("Shadow messenger",message);
  10. }
  11.  
  12. public static class OriginalMessenger {
  13.  
  14. public String getMessage() {
  15. return "Original messenger";
  16. }
  17. }
  18.  
  19. @Implements(OriginalMessenger.class)
  20. public static class ShadowMessenger extends OriginalMessenger {
  21.  
  22. @Implementation
  23. public String getMessage() {
  24. return "Shadow messenger";
  25. }
  26. }
  27. }

在该示例中,OriginalMessenger是库中的类,并提供默认功能.而ShadowMessenger是包含当我使用OriginalMessenger时要应用的自定义行为的类.

但是当我运行测试失败.消息的内容是“原始信使”.好像ShadowMessenger从未被使用过.

我究竟做错了什么?

解决方法

原来你只能影子Android类.但是,通过定制的robolectric测试跑步者,您也可以影响自己的课程.

Robolectric 3.1.4(RobolectricGradleTestRunner已完全删除,因此您需要覆盖RobolectricTestRunner中描述的方法)

  1. @Override
  2. protected ShadowMap createShadowMap() {
  3. return new ShadowMap.Builder()
  4. .addShadowClass(OriginalMessenger.class,ShadowMessenger.class,true,true)
  5. .build();
  6. }

Robolectric 3.0

  1. @Override
  2. public InstrumentationConfiguration createClassLoaderConfig() {
  3. InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder();
  4. builder.addInstrumentedClass(OriginalMessenger.class.getName());
  5. return builder.build();
  6. }

Robolectric 2.4

  1. @Override
  2. protected ClassLoader createRobolectricClassLoader(Setup setup,SdkConfig sdkConfig) {
  3. return super.createRobolectricClassLoader(new ExtraShadows(setup),sdkConfig);
  4. }
  5.  
  6. class ExtraShadows extends Setup {
  7. private Setup setup;
  8.  
  9. public ExtraShadows(Setup setup) {
  10. this.setup = setup;
  11. }
  12.  
  13. public boolean shouldInstrument(ClassInfo classInfo) {
  14. boolean shoudInstrument = setup.shouldInstrument(classInfo);
  15. return shoudInstrument
  16. || classInfo.getName().equals(OriginalMessenger.class.getName());
  17. }
  18. }

示例项目https://github.com/nenick/android-gradle-template/

猜你在找的Java相关文章