java - 如何使用给定的自定义注释运行测试用例

标签 java testing reflection junit

我只想在提供注释的情况下运行集成测试。问题是测试用例需要一些变量,这些变量需要在 @Before 中初始化并在 @After 中销毁。

我编写了执行带有注释的测试的代码,但由于需要在 @Before 阶段初始化的变量,它们都失败了。

我首先调用@Before 阶段(我假设变量已初始化),然后运行测试方法,然后调用@After 阶段。但是我在测试方法中得到了 NullPointerException

如何为测试方法初始化变量??调用 @Before 阶段还不够吗??

我的代码:

public static void main(String[] args) throws Exception {
    Class<TodoMapperTest> obj = TodoMapperTest.class;

    int passed = 0;
    int failed = 0;
    int count = 0;

    for (Method method : obj.getDeclaredMethods()) {
      if (method.isAnnotationPresent(Before.class))
        method.invoke(obj.newInstance());

      if (method.isAnnotationPresent(DEV.class)) {
        try {
          method.invoke(obj.newInstance());
          System.out.printf("%s - Test '%s' - passed %n", ++count, method.getName());
          passed++;
        } catch (Throwable ex) {
          System.out.printf("%s - Test '%s' - failed: %s %n", ++count, method.getName(), ex);
          failed++;
        }
      }

      if (method.isAnnotationPresent(After.class))
        method.invoke(obj.newInstance());
    }

    System.out.printf("%nResult : Total : %d, Passed: %d, Failed %d%n", count, passed, failed);
  }

@Before阶段:

TodoQueryMapper mapper;
SqlSession session;

@Before
  public void setUp() throws Exception {
    InputStream inputStream = Resources.getResourceAsStream("todo-mybatis/mybatis-test.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    inputStream.close();

    session = sqlSessionFactory.openSession();
    mapper = session.getMapper(TodoQueryMapper.class);
  }

编辑: 测试用例:

@Test
@DEV
public void test_case() throws Exception {
  SqlParams params = new SqlParams();
  params.idList = Collections.singletonList(1234567);

  // In here, 'mapper' variable is null, even @Before invoked
  List<TodoDto> data = mapper.findByIdList(params); 

  assertEquals(1, data.size());
}

DEV 注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DEV {
}

最佳答案

每次您通过反射调用一个方法时,您都会创建一个新的测试类实例:method.invoke(obj.newInstance());

您应该将测试执行分为三个阶段:之前、测试和之后。迭代测试方法,找到之前和之后的方法并按所需顺序执行它们。

伪代码:

Class<AccountDaoMapperTest> objClass = AccountDaoMapperTest.class;
for (Method testMethod : findTestMethods(objClass)) {
    AccountDaoMapperTest objUnderTest = objClass.newInstance();
    findBeforeMethod(objClass).invoke(objUnderTest);
    testMethod.invoke(objUnderTest);
    findAfterMethod(objClass).invoke(objUnderTest);
}

关于java - 如何使用给定的自定义注释运行测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34808250/

相关文章:

testing - cucumber - 我应该在 "first"之前看到 "last"- Rails 3.1

c# - 如何检查拆分容器内的所有文本框?

java - 保存用反射修改的类的字节码

php - 如何从继承的方法中获取派生类的路径?

java - 网络回调onAvailable方法中接口(interface)空指针异常

Java EE JDBC 领域

java - 我在 java 字符串中有 HTML,我想将其呈现为 PDF。有可用的 API 或引用吗?

java - 并发、对象可见性

c++ - 如何对电子邮件客户端进行单元测试

c# - PropertyInfo.GetProperty 在不应返回 null 时返回