Skip to content

Latest commit

 

History

History
 
 

Android测试框架:Dagger2+Espresso2+Mockito

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

Android测试框架: Dagger 2 + Espresso 2 + Mockito


我一直在用Dagger, Espresso和Mockito做Android测试,爱死这个组合了!为了庆祝Dagger 2的推出,我分享了一个用Dagger 2, Espresso 2和Mockito做Android测试的Demo

Dagger 组件(Components)

Dependency injection(依赖注入) 允许我们在App开发和测试中可以获取到不同的模块,非常有利于创建可重用的测试用例,这个Demo App的功能是以"yyyy-MM-dd"格式显示今天的日期,我们需要测试一下来应对一些已知的日期,而非依赖于运行测试时的真实日期。

Dagger 2中,一个组件(Component)接口可以给整个App提供模块,并且定义了在哪注入它们。

public interface DemoComponent {
	void inject(MainActivity mainActivity);
}

@Singleton
@Component(modules = ClockModule.class)
public interface ApplicationComponent extends DemoComponent {
}

@Singleton
@Component(modules = MockClockModule.class)
public interface TestComponent extends DemoComponent {
	void inject(MainActivityTest mainActivityTest);
}

**ApplicationComponent组件用于App的正常运行, 而TestComponent组件则用于测试,这两个组件都可以被注入到MainActivity**中。

**MainActivity如何知道使用的哪个组件(component)? 答案是通过DemoApplication**来注入, 它保存着该组件(component)的引用。

private DemoComponent component = null;

@Override 
public void onCreate() {
	super.onCreate();
	if (component == null) {
		component = DaggerDemoApplication_ApplicationComponent
					.builder()
					.clockModule(new ClockModule())
					.build();
  }
}

public void setComponent(DemoComponent component) {
	this.component = component;
}

public DemoComponent component() {
	return component;
}

测试时,我们需要在**onCreate()方法执行之前调用setComponent()方法,将组件设置为TestComponent。而App正常运行时,组件在onCreate()方法中就被设置为ApplicationComponent**了。

Mockito

App中有一个**Clock**类,其中有一个方法可以返回当前的时间:

public DateTime getNow() {
	return new DateTime();
}

TestComponent组件中包含MockClockModule模块,后者使用Mockito提供了一个模拟的Clock。这样MainActivityTest就可以在测试期间提供一个预先设置的日期了。

Mockito.when(clock.getNow()).thenReturn(new DateTime(2008, 9, 23, 0, 0, 0));

因为我们使用了单例, 相同的模拟**Clock**将为整个App提供日期,这样就能被显示提供的日期,而非今天的日期了:

onView(withId(R.id.date)).check(matches(withText("2008-09-23")));

更多

这里还有很多示例, 包括使用intent启动的activity的测试和使用JUnit测试的单元测试,请点击下面链接查看:

Click Me

相关阅读: