【十】注入框架RoboGuice使用:(Your First Testcase)

         上一篇我们简单的介绍了一下RoboGuice的使用(【九】注入框架RoboGuice使用:(Your First Injected Service and BroadcastReceiver)),今天我们来看下测试用例(TestCase)的注入

       RoboGuice使得我们更加容易实现可测试的Android应用程序,本文章就来详细解说下:当我们测试的时候,如何编写测试用例,已经从RoboGuice中获益。本文章使用Android Robolectric,适合大部分用Android标准测试的情况。

       我们用Mockito来模拟关系依赖,EasyMock使用同一种方式。

       (一):来进行测试RoboActivity的子类,假设现在有一个使用Service 的Activity       

public class MyRoboActivity extends RoboActivity {
    @Inject MyService service;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        service.compute();
    }
}

public class MyService {
    public void compute() {
        ...
    }
}
       然后需要编写测试用例来检查Activity是否正确调用了servce。

@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {
    private Service serviceMock = mock(Service.class);

    @Before
    public void setup() {
        // Override the default RoboGuice module
        RoboGuice.overrideApplicationInjector(Robolectric.application, new MyTestModule());
    }

    @After
    public void teardown() {
        // Don't forget to tear down our custom injector to avoid polluting other test classes
        RoboGuice.Util.reset();
    }

    @Test
    public void createTriggersCompute() throws InterruptedException {
        Robolectric.buildActivity(MyActivity.class).create().start();
        verify(serviceMock).compute();
    }


    public class MyTestModule extends AbstractModule {
        @Override
        protected void configure() {
            bind(Service.class).toInstance(serviceMock);
        }
    }
}
     该测试以下几项:

      ①:在设置的时候,会覆盖RoboGuice默认绑定并且使用一个自定义的测试模块

      ②:这个测试模块绑定Service到mock上面

      ③:该测试创建一个MyActivity的实例,该会通过注入(injection)获取mock
      ④:验证mock应该被调用.

    (二):测试一个服务,假设有个service如下:

public class MyService {
    @Inject Vibrator vibrator;
    @Inject Context context;

    public void compute() {
        context...
        vibrator.vibrate(...);
    }
}
     然后我们可以编写一个简单的测试用来检测service是否正确调用了 vibrator

@RunWith(RobolectricTestRunner.class)
public class ServiceTest {
    protected Vibrator vibratorMock = mock(Vibrator.class);
    protected Service service;

    @Before
    public void setup() {
        // Override the default RoboGuice module
        RoboGuice.overrideApplicationInjector(Robolectric.application, new MyTestModule());
        service = RoboGuice.getInjector(Robolectric.application).getInstance(Service.class);
    }

    @After
    public void teardown() {
        // Don't forget to tear down our custom injector to avoid polluting other test classes
        RoboGuice.Util.reset();
    }

    @Test
    public void computeShouldCausePhoneToVibrate() {
        service.compute();
        verify(vibratorMock).vibrate(...);
    }

    public class MyTestModule extends AbstractModule {
        @Override
        protected void configure() {
            bind(Vibrator.class).toInstance(vibratorMock);
        }
    }
}
       该测试以下几项:

       ①:在设置的时候,会覆盖RoboGuice默认绑定并且使用一个自定义的测试模块
      ②:该测试模块绑定Vibrator到mock中

      ③:该测试模块会创建service的实例,通过注入会获取上下文以及mock

      ④:验证mock已经被调用了

    


      

你可能感兴趣的:(android,service,testcase,roboguice,Robolectric)