Categories
未分类

Android单元测试(十):DaggerMock:The Power of Dagger2, The Ease of Mockito

## The Old Way 我们在系列的第六篇文章前面介绍了Dagger2在单元测试里面的使用姿势。大致过程是这样的,首先,你要mock出一个Module,让它的某个Provider方法在被调用的时候,返回你想到的mock的Dependency。然后使用这个mock的module来build出一个Component,再把这个Component放到你的ComponentHolder。举个例子说明一下,假设你有一个LoginActivity,里面有一个LoginPresenter,是通过Dagger2 inject进去的,如下: public class LoginActivity extends AppCompatActivity { @Inject LoginPresenter mLoginPresenter; @Override protected void onCreate(Bundle savedInstanceState) { //…other code ComponentHolder.getAppComponent().inject(this); } } //对应的Test类如下: @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21) public class LoginActivityTest { @Test public void testLogin() { AppModule mockAppModule = Mockito.mock(AppModule.class); LoginPresenter mockLoginPresenter = mock(LoginPresenter.class); Mockito.when(mockAppModule.provideLoginPresenter(any(UserManager.class), any(PasswordValidator.class))).thenReturn(mockLoginPresenter); //当mockAppModule的provideLoginPresenter()方法被调用时,让它返回mockLoginPresenter AppComponent […]

Categories
未分类

安卓单元测试(九):使用Mockito Annotation快速创建Mock

注: 如果你还不了解Mock的概念或Mockito框架的使用,请先看这篇文章。 ### @Mock的基本用法 如果你follow了这个安卓单元测试系列文章,那么到现在为止,你应该很清楚mock的概念和使用了,创建Mock的方法我们都知道: YourClass yourInstance = Mockito.mock(YourClass.class); 比如: public class LoginPresenterTest { @Test public void testLogin() { UserManager mockUserManager = mock(UserManager.class); PasswordValidator mockValidator = mock(PasswordValidator.class); Mockito.when(mockValidator.verifyPassword("xiaochuang is handsome")).thenReturn(true); LoginPresenter presenter = new LoginPresenter(mockUserManager, mockValidator); presenter.login("xiaochuang", "xiaochuang is handsome"); verify(mockUserManager).performLogin("xiaochuang", "xiaochuang is handsome"); } } 虽然很简单,但是如果一个测试类里面很多测试方法都要用到mock,那写起来就会有点麻烦,这时候我们可以写一个@Before方法来作这个setup工作: public class LoginPresenterTest { UserManager mockUserManager; PasswordValidator mockValidator; […]

Categories
未分类

安卓单元测试(八):Junit Rule的使用

JUnit Rule是什么 一个JUnit Rule就是一个实现了TestRule的类,这些类的作用类似于@Before、@After,是用来在每个测试方法的执行前后执行一些代码的一个方法。 如果你不清楚@Before、@After这些Annotation的意思,Chances are你还不了解Junit的使用,建议先看这篇文章。 那为什么不直接用这些annotation呢?这是因为它们都只能作用于一个类,如果同一个setup需要在两个类里面同时使用,那么你就要在两个测试类里面定义相同的@Before方法,然后里面写相同的代码,这就造成了代码重复。有的人说你可以用继承啊,首先我想说,我很讨厌继承这个东西,所以如果可以不用继承的话,我就不会用;再次我想说,如果你不讨厌继承的话,从现在开始,你也应该慢慢的讨厌它了。 此外,JUnit Rule还能做一些@Before这些Annotation做不到的事情,那就是他们可以动态的获取将要运行的测试类、测试方法的信息。这个在接下来的一个例子里面可以看到。 怎么用JUnit Rule? 使用框架自带的Rule 很多测试框架比如JUnit、Mockito自带给我们很多已经实现过好了的JUnit Rule,我们可以直接拿来用。比如Timeout,TemporaryFolder,等等。这些Rule的使用方法非常简单。定义一个这些类的public field,然后用@Rule修饰一下就好了。比如 public class ExampleTest { @Rule public Timeout timeout = new Timeout(1000); //使用Timeout这个 Rule, @Test public void testMethod1() throws Exception { //your tests } @Test public void testMethod2() throws Exception { //your tests2 } //other test methods } 那么,对于上面这个ExampleTest的每一个测试方法。它们的运行时间都不能超过1秒钟,不然就会标志为失败。而它的实现方式就是在每个方法测试之前都会记录一下时间戳,然后开始倒计时,1秒钟之后如果方法还没有运行结束,就把结果标记为失败。 这里需要注意的一点是Rule需要是public field […]