ImangazalievM/CleanArchitectureManifest

SchedulersProvider can be omitted

NikolayKul opened this issue · 1 comments

SchedulersProvider adds an extra overhead and can be safely ommitted using the following Rule:

public class RxSchedulersRule implements TestRule {
    private final TestScheduler testScheduler = new TestScheduler();
    private final RxAndroidSchedulersHook androidSchedulersHook = new RxAndroidSchedulersHook() {
        @Override
        public Scheduler getMainThreadScheduler() {
            return Schedulers.trampoline();
        }
    };

    public TestScheduler getTestScheduler() {
        return testScheduler;
    }

    @Override
    public Statement apply(Statement base, Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                RxAndroidPlugins.getInstance().registerSchedulersHook(androidSchedulersHook);
                RxJavaHooks.setOnIOScheduler(scheduler -> testScheduler);
                RxJavaHooks.setOnComputationScheduler(scheduler -> testScheduler);
                RxJavaHooks.setOnNewThreadScheduler(scheduler -> testScheduler);
                base.evaluate();
                RxAndroidPlugins.getInstance().reset();
                RxJavaHooks.reset();
            }
        };
    }
}

Example of usage:

public class UseCaseTest {
    @Rule
    public RxSchedulersRule rxSchedulersRule = new RxSchedulersRule();

    private UseCase useCase;

    @Before
    public void setUp() throws Exception {
        useCase = ...
    }

    @Test
    public void some_usecase_test() throws Exception {
        // preparing
        ...

        // testing
        useCase.execute();
        rxSchedulersRule.getTestScheduler().triggerActions();

        // asserting
        ...
    }

}

Thanks for your suggestion, I will fix it in the next version.