Google Guiceを利用したJUnit試験用のRunnerとAnnotation 改造

前回作成したTestRunnerに対して、Moduleのクラス名のsafixにTestが付いているものを優先して読み込むように改造した。
#テスト時は、xxxxを利用したいといった場合用です。

public class GuiceJunitRunner extends BlockJUnit4ClassRunner {

    protected final static Log _log = LogFactory.getLog(GuiceJunitRunner.class);

    public GuiceJunitRunner(Class<?> klass) throws InitializationError {
        super(klass);
    }

    @Override
    protected void validateZeroArgConstructor(List<Throwable> errors) {
        // nothing
    }

    @Override
    protected Object createTest() throws Exception {
        Class<?> cls = getTestClass().getJavaClass();
        GuiceStage guiceStage = cls.getAnnotation(GuiceStage.class);
        GuiceModule guiceModule = cls.getAnnotation(GuiceModule.class);

        Injector injector = null;

        List<Module> modules = new ArrayList<Module>();
        if (guiceModule != null)
            for (Class<?> moduleClass : guiceModule.value()) {
                try {
                    String testModule = moduleClass.getName() + "Test";
                    try {
                        moduleClass = Class.forName(testModule);
                    } catch (Exception e) {
                        ; // nothing
                    }
                    modules.add((Module) moduleClass.newInstance());
                } catch (InstantiationException e) {
                    if (_log.isErrorEnabled()) {
                        _log.error(MessageFormat.format(
                            "InstantiationException Module is {1}",
                            moduleClass.toString()), e);
                    }
                    throw e;
                } catch (IllegalAccessException e) {
                    if (_log.isErrorEnabled()) {
                        _log.error(MessageFormat.format(
                            "IllegalAccessException Module is {1}",
                            moduleClass.toString()), e);
                    }
                    throw e;
                }
            }

        if (guiceStage != null && guiceModule != null) {
            injector = Guice.createInjector(guiceStage.value(), modules);
        } else if (guiceStage != null) {
            injector = Guice.createInjector(guiceStage.value());
        } else if (guiceModule != null) {
            injector = Guice.createInjector(modules);
        } else {
            injector = Guice.createInjector(Stage.DEVELOPMENT);
        }

        return injector.getInstance(getTestClass().getJavaClass());
    }
}