1

単体テストを簡単に記述できるように、汎用クラスを作成しました。基本的には、同じメソッドを使用してテストをセットアップできるようにし、いくつかの共通メソッドを使用してテストできるようにするためです。ジェネリック クラスのポイントは、作業しているクラスを気にしないことですが、この情報があると役立ちます (具体的な実装は、適切な型のインスタンス変数を持つことができます)。

これが私のクラスです:

public abstract class AbstractModuleTest<M extends Module> {
  @Autowired protected WebDriver driver;
  private final Type type;

protected AbstractModuleTest() {
  final ParameterizedType parameterizedType = 
      (ParameterizedType) getClass().getGenericSuperclass();
  type = parameterizedType.getActualTypeArguments()[0];
}

protected <S extends AbstractPage> M setup(final S s, final String errorMsg) {
  for (final Module m : s.getModules()) {
    if (m.getClass().equals(type)) {
      try {
        final Class c = Class.forName(StringUtils.subStringAfter(type.toString(), " "));
        return (M) c.cast(m);
      } catch (ClassNotFoundException cnfe) { throw new RuntimeException(cnfe); }
    }
  }
  Assert.fail(errorMsg);
}

私が扱っているクラスを取得する簡単な方法はありますか (StringUtils.substringAfter 呼び出しを避けるため)?

4

2 に答える 2

3

Classその方法では必要ありません。m.getClass().equals(type))返されるときはtrue、チェックされていないキャストを実行しても安全です (ジェネリックである場合、おそらくいくつかのまれなケースが存在する可能性がありMますが、コードもそれらをキャッチしません):

protected <S extends AbstractPage> M setup(final S s, final String errorMsg) {
    for (final Module m : s.getModules()) {
        if (m.getClass().equals(type)) {
            @SuppressWarnings("unchecked")
            M result = (M) m;
            return result;
        }
    }
    Assert.fail(errorMsg); 
}
于 2012-04-26T17:08:15.570 に答える
1

クラス名にスペースを含めることはできません。Split メソッドを使用して、StringUtils の使用を避けることができます。

type.toString().split(" ")[1];
于 2012-04-26T17:14:09.257 に答える