2.Robolectric,Rule

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接口来做。

你可能感兴趣的:(2.Robolectric,Rule)