1.测试类使用Daager2的时机:
如果被测类(比如说LoginActivity)的Dependency(LoginPresenter)是通过 field injection inject进去的,那么再测这个类(LoginActivity)的时候,就必须用dagger2,不然很难优雅的把mock传进去。相反,如果被测类有Constructor(比如说LoginPresenter),Dependency是通过Constructor传进去的,那么就可以不使用dagger2,而是直接new对象出来测
2.自定义Rule
如下所示:
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class LoginActivityTest {
/**
* 自定义测试规则
*/
@Rule
public TestRule testRule = new TestRule() {
@Override
public Statement apply(final Statement base, final Description description) {
// final String className = description.getClassName();
// final String methodName = description.getMethodName();
return new Statement() {
@Override
public void evaluate() throws Throwable {
//想要在测试方法运行之前做一些事情,就在base.evaluate()之前做, 注意:测试方法运行之前做的事情同样也能放在apply()方法中,只要是在base.evaluate()之前就行
String className = description.getClassName();
String methodName = description.getMethodName();
base.evaluate();
//想要在测试方法运行之后做一些事情,就在base.evaluate()之后做
System.out.println("Class name: "+className +", method name: "+methodName);
}
};
}
};
@Test
public void login3() throws Exception {
UserManager userManager = mock(UserManager.class);
LoginPresenter loginPresenter = new LoginPresenter(userManager);
loginPresenter.login("123456", "654321");
verify(userManager).performLogin("123456", "654321");
}
}
运行结果为:
运行结果也可以自定义一个类实现TestRule接口来做。
网友评论