当前位置: 首页 > 知识库问答 >
问题:

Junit 4 - 运行测试类中的所有测试

云何平
2023-03-14

我一直在设置一些合约JUnit 4测试(遵循回答这个问题的建议) - 例如,如果我有一个接口(我已经在示例中包含了泛型,因为我在我的项目中使用它们) - 但是,这是一个大大简化的示例:

public interface MyInterface<T> {
  public T myMethod();
}

我可以创建一个抽象的合同测试,例如:

public abstract class AbstractMyInterfaceTest<T> {

  private final MyInterface<T> _impl;  
  // plus, store stuff to test against;

  public AbstractMyInterfaceTest(MyInterface<T> impl, ... stuff to test against){
    _impl = impl;
    // stuff to test against...
  } 

  @Test
  public void testMyMethod(){
    // test some stuff...
  }
}

...并为每个实现扩展此抽象测试类(我使用@RunWith(参数化.class)运行)。我还将一些变量传递给抽象测试类,以测试接口的实现。

然而,实际上,一些接口返回的对象是其他接口的实现,我希望能够使用该接口的抽象契约类(…和相关变量)测试这个实现。例如,MyInterface中的方法可能返回一个迭代器-这是一个接口。我有一个单独的AbstractIteratorTest,它针对一组值运行迭代器的契约测试,我想检查MyInterface的实现返回迭代器是否通过了abstractIterator测试中的契约测试。

目前,我正在向抽象测试类中添加以下内容:

// N.b. not setting @Test - so doesn't run all tests twice...
public void runTests(){
  testMyMethod();
  // etc.
}

然而,这并不独立地运行每个测试(例如,在每个测试方法之前运行< code>setUp()),所以如果那些契约测试期望每个测试的实现处于特定的状态,就会出现问题。(一个具体的例子是测试< code>Iterator接口的实现,其中每个测试方法都可以改变被测试的< code>Iterator的状态)

有没有更好的方法,比如利用JUnit 4的特性?

我见过关于< code > @ run with(suite . class)注释的东西,但那似乎是关于从一个测试类运行多个测试类,并且不允许您将变量传递到正在运行的不同测试类中。可能有一种方法可以使用这个< code >套件来解决我的问题,但我不确定它是什么...

共有1个答案

聂鹏云
2023-03-14

首先,如果你是抽象测试类的子类,你不需要使用< code >参数化。你可以使用< code >参数化来代替子类化,但是你不太可能两者都需要。除非您想测试每个实现的多个实例,我将在下面演示!

一种方法是让返回实例的测试简单地成为< code > AbstractAnotherInterfaceTest 的更多子类或参数化。

假设你有:

public abstract class AbstractAnotherInterfaceTest {

    private AnotherInterface instance;

    protected AbstractAnotherInterfaceTest(AnotherInterface instance) {
        this.instance = instance;
    }

    @Test
    public void everythingIsOkay() {...}

}

你有:

public class Pony implements AnotherInterface { ... }
public class PonyProducingMyInterface implements MyInterface<Pony> { ... }

你可以写:

@RunWith(Parameterized.class)
public class PonyTest extends AbstractAnotherInterfaceTest {

    @Parameterized.Parameters
    public static Collection<Pony> ponies() {
        return Arrays.asList(
            new Pony(), // base case
            new PonyProducingMyInterface().myMethod() // testing the factory
        );
    }

    public PonyTest(Pony instance) {
        super(pony);
    }

}

诚然,这有点奇怪,因为新的PonyProducingMyInterface(). myMethod()案例实际上是对PonyProducingMyInterface的测试,但被归类在AbstractAntherInterfaceTest下。

我能想到的唯一方法就是在 AbstractMyInterfaceTest 的某个子类中使用抽象另一个接口测试,方法是编写一个自定义的 ParentRunner,它知道如何将抽象另一个接口测试的实例设置为 AbstractMyInterfaceTest 实例的子级。您可能希望使其有点通用,使用注释来指导该过程。

 类似资料:
  • 问题内容: 在JUnit4中可以吗? 在JUnit3中,我将执行以下操作: 问题答案: takari-cpsuite(最初由Johannes Link 开发)提供了一个适合您需求的classpath- suite。它允许通过正则表达式对Classpath中的类进行过滤,例如:

  • 主要内容:1 Junit分类测试的介绍,2 在Maven中进行分类测试,3 在Gradle中进行分类测试,4 在SBT中进行分类测试,5 分类测试的典型用法1 Junit分类测试的介绍 从给定的一组测试类中,类别运行器仅运行用@IncludeCategory批注指定的类别或该类别的子类型进行批注的类和方法。类或接口都可以用作类别。子类型有效,因此,如果您说@IncludeCategory(SuperClass.class),则会运行标记为@Category({SubClass.class})的测

  • 我试图在JUnit5测试环境中使用JUnit4。事实上,我已经升级了我的pom来使用更高版本的MOckito和POwerMock。到目前为止,所有测试都基于JUnit4。我将平台和vintage依赖项添加到我的pom.xml中。 更早的pom。xml依赖关系

  • 对于测试证据,我想将我写到特定目录中的所有测试工件(例如服务器调用和响应)存档。我得到了压缩目录的方法,但我没有找到合适的地方来执行它。 测试生命周期回调似乎不是正确的位置,因为@AfterAll在每个测试类之后被调用,但是存档应该在所有测试类中的所有测试终止后生成。 在阅读了诸如如何在模块中执行之前和之后分别编码一次的帖子之后?似乎没有希望在jUnit中执行调用。 我找到了一个扩展TestLau