【十】注入框架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已经被调用了

时间: 2024-11-14 05:24:07

【十】注入框架RoboGuice使用:(Your First Testcase)的相关文章

【十四】注入框架RoboGuice使用总结

在我们平时开发Android项目的时候例如经常需要使用各种View控件,然后进行声明,findViewById,并且进行强转.每次都要写这样的代码就显得非常繁琐,并且容易出错哦.那么针对这种情况且不限定于以上的这类情况,Dependency injection 可以大大降低了类之间的依赖性,可以通过annotation (Java)描述类之间的依赖性,避免了直接调用类似的构造函数或是使用Factory来参加所需的类,从而降低类或模块之间的耦合性,以提高代码重用并增强代码的可维护性.Google

【十一】注入框架RoboGuice使用:(Your First Injection into a Custom View class)

上一篇我们简单的介绍了一下RoboGuice的使用([十]注入框架RoboGuice使用:(Your First Testcase)),今天我们来看下自定义View的注入(Custom View). 在开始本文之前,你先要熟悉普通Java对象的注入(点击进入).在RoboGuice 3.0版本中你同样给自定义View(Custom View)进行诸如. class MyView extends View { @Inject Foo foo; @InjectView(R.id.my_view) T

【十二】注入框架RoboGuice使用:(Your First Injected ContentProvider)

上一篇我们简单的介绍了一下RoboGuice的使用([十一]注入框架RoboGuice使用:(Your First Injection into a Custom View class)),今天我们来看下内容提供者(ContentProvider)的注入. 和Robo*Activities一样,RoboContentProviders通过RoboGuice也能自动获得注入,为了简便我们可以注入 authority URI,这时我们需要定义下面自己的module: public class Con

【十三】注入框架RoboGuice使用:(Logging via Ln)

上一篇我们简单的介绍了一下RoboGuice的使用([十二]注入框架RoboGuice使用:(Your First Injected ContentProvider)),今天我们来看下Log日志使用. Android应用通过会使用内置的android.util.log在Android控制台上面打印日志信息.RoboGuice也提供了另外的日志管理,你可能会想要使用. (一):  RoboGuice日志管理和通常的Log差不多,但也同样具备以下优点: ①:对于发布包来说,Debug and ver

【五】注入框架RoboGuice使用:(Your First POJO Injection)

上一篇我们简单的介绍了一下RoboGuice的使用([四]注入框架RoboGuice使用:(Your First System Service Injection)),今天我们来看下普通Java对象的使用注解的方法: (一)为了在Activity中普通Java对象使用注解,必须实现以下两个步骤: ①:创建继承RoboActivity的Activity ②:使用 @Inject来进行注解POJO(普通java对象) 在前面我们介绍了View控件,资源文件(Resources),系统服务(Syste

【四】注入框架RoboGuice使用:(Your First System Service Injection)

上一篇我们简单的介绍了一下RoboGuice的使用([三]注入框架RoboGuice使用:(Your First Resource Injection)),今天我们来看下系统服务的使用注解的方法: 为了在Activity中系统服务使用注解,必须实现以下两个步骤: ①:创建继承RoboActivity的Activity ②:使用 @Inject来进行注解系统服务 下面我们来实现一个例子,和上一篇文章例子差不多,我们需要进行实现系统服务,我们同样创建一个继承RoboActivity的Activity

【九】注入框架RoboGuice使用:(Your First Injected Service and BroadcastReceiver)

上一篇我们简单的介绍了一下RoboGuice的使用([八]注入框架RoboGuice使用:(Your First Injected Fragment)),今天我们来看下服务(Service)和广播接受者(BroadCast Receiver)的注入 (一):和Robo*Activities一样,RoboServices和RoboIntentServices通过RoboGuice也自动接受注入. 下面是一个使用RoboGuice注入的android service的例子: public class

【二】注入框架RoboGuice使用:(Your First View Injection)

上一篇我们简单的介绍了一下RoboGuice的使用([一]注入框架RoboGuice使用:(A brief example of what RoboGuice does)),今天我们我看下View的注解的使用方法. 为了在Activity中使用View的注解,必须实现以下三个步骤: ①:自己定义的Activity继承RoboActivity ②:设置内容视图 content View ③:使用 @InjectView来进行注解View控件 下面我们来详细看一下使用方法: (一)首先创建一个继承与

【三】注入框架RoboGuice使用:(Your First Resource Injection)

上一篇我们简单的介绍了一下RoboGuice的使用([二]注入框架RoboGuice使用:(Your First View Injection)),今天我们来看下资源文件的使用注解的方法: 为了在Activity中资源文件使用注解,必须实现以下两个步骤: ①:创建继承RoboActivity的Activity ②:使用 @InjectResource来进行注解资源文件 下面我们来实现以下.现在加入我们在res/anim目录下面有一个动画文件my_animation.xml,那我们使用@Injec