当前位置: 首页 > 面试题库 >

在方法级别(不是类级别)为junit 4测试指定顺序

隗星驰
2023-03-14
问题内容

我知道这是一个不好的做法,但是需要完成,否则我需要切换到testng。有没有一种类似于JUnit
3的testSuite的方法来指定要在类中运行的测试的顺序?


问题答案:

如果你确定你 真的 想这样做:有可能是一个更好的办法,但是这是我能拿出…

JUnit4有一个注释:@RunWith它使您可以覆盖测试的默认Runner。

在您的情况下,您将需要创建一个特殊的子类BlockJunit4ClassRunner,并重写computeTestMethods()以按照您希望它们执行的顺序返回测试。例如,假设我想以相反的字母顺序执行测试:

public class OrderedRunner extends BlockJUnit4ClassRunner {

    public OrderedRunner(Class klass) throws InitializationError {
        super(klass);
    }

    @Override
    protected List computeTestMethods() {
        List list = super.computeTestMethods();
        List copy = new ArrayList(list);
        Collections.sort(copy, new Comparator() {
            public int compare(FrameworkMethod o1, FrameworkMethod o2) {
                return o2.getName().compareTo(o1.getName());
            }
        });
        return copy;
    }
}


@RunWith(OrderedRunner.class)
public class OrderOfTest {
    @Test public void testA() { System.out.println("A"); }
    @Test public void testC() { System.out.println("C"); }
    @Test public void testB() { System.out.println("B"); }
}

运行此测试将产生:

C
乙
一个

对于您的特定情况,您需要一个比较器,该比较器按照您希望它们执行的顺序按名称对测试进行排序。(我建议使用谷歌Guava类之类的方法来定义比较器Ordering.explicit("methodName1","methodName2").onResultOf(...);,其中onResultOf提供了一个将FrameworkMethod转换为其名称的函数…尽管显然您可以自由地实现所需的任何方式。



 类似资料:
  • Spring Transaction Propagation如何为Propagation_REQUIRED和Propagation_REQUIRED_NEW工作? 请提供有关类到类级别和方法到方法级别的传播的信息。 我还需要知道如何初始化/启动这些事务,并在当前事务完成时恢复以前的事务,以进行传播。 在需要传播和需要新传播的情况下使用单个事务时,事务将如何决定何时需要提交/回滚?

  • 我一直在研究Java多线程概念。我看得越多,就越困惑。 现在我不明白Java中类级别、对象级别、显式锁定和内在锁定之间的区别。有人能告诉我是什么吗?此外,如果我能得到一些例子来理解,那将对我很有帮助。

  • 当我运行应用程序并点击http://localhost:8080/hello时,一切都很好: 但是,如果我删除了方法上的注释: 然后参数变为null,aspect方法抛出NullPointerException。 这似乎起作用了,但这是一个好的解决办法吗? 编辑:此解决方案也不起作用。如果我在类和方法级别上都有注释,假设类级别的注释值为false,而方法级别为true,那么注释值将为false。

  • 问题内容: 我一直在研究Java多线程概念。我越经历他们,我就越困惑。 现在,我还不了解Java中的类级别,对象级别,显式和固有锁定之间的区别。有人可以让我知道这是什么吗?另外,如果我可以理解一些示例,那对我也将非常有帮助。 问题答案: 显式与内在 当您在对象上使用或间接用作方法签名的一部分时,您正在创建内部锁。您依赖与所有对象和类关联的内置锁。 软件包中的Java 5+提供了显式锁。最常用的类可

  • 问题内容: 我对Spring 3.2.3 @Transactional注解有疑问。我的服务类如下所示: 如果我调用persist()方法,所有方法都可以正常工作。但是,如果我在类级别将@Transactional注释掉- 事务将不会启动。谁能告诉我为什么Spring只能在methol级忽略@Transactional? 问题答案: 您不能从processDisclosureData()调用pers

  • 我正在研究testng中的一个问题。我想知道是否有办法在测试类级别指定超时,而不是单个方法。我知道套件xml级别的“超时”,但这适用于每个测试类中的每个测试方法。 我真的希望能够指定一个适用于xml中每个类的超时,这样我们就可以研究如何改进这些类。