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 回答