【问题标题】:How to Clear instance filed afterClass in Junit?如何在 Junit 中清除 afterClass 提交的实例?
【发布时间】:2013-04-11 09:45:45
【问题描述】:

我正在寻找一种方法来收集和发布这些myResults。但是Junit@AfterClass只支持静态方法。

如果我有一个超类如果正在运行多个测试用例,它可能很难看。知道如何解决这个问题吗?如果我使用 after,我不会得到 myresult 收集的完整输出

abstract class MainTestCase{
  static List<String> myResults = new ArrayList();

  @AfterClass public static void WrapUp() {

    //code to write the myResults to text file  goes here
    System.out.println("Wrapping Up");
    myResults.clear()
  }

}

@RunWith(Theories.class)
public class TheoryAfterClassTest extends MainTestCase {

  @DataPoint
  public static String a = "a";

  @DataPoint
  public static String b = "bb";

  @DataPoint
  public static String c = "ccc";

  @Theory
  public void stringTest(String x, String y) {
    myResults.add(x + " " + y);
    System.out.println(x + " " + y);
  }      
}

【问题讨论】:

  • 如果将WrapUp()设为静态会发生什么?
  • 另外,您可能想看看使用参数化测试。这些也许可以让你一起摆脱继承层次结构。
  • @Code-Guru 如何确保从超类扩展的其他测试用例不受影响。我显然不想混淆它们。有什么建议吗?
  • @Code-Guru 我的真实代码由对象组成,所以理论很适合我。
  • 你的意思是如果多个测试用例并行运行会很难看?

标签: java junit theory


【解决方案1】:

List&lt;String&gt; myResults; 放入ThreadLocal 可能会解决问题,这就是所有并行测试用例将拥有自己的myResults 实例的方式。

static ThreadLocal<List<String>> myResults = new ThreadLocal<>();

@BeforeClass
public static void setUpClass() {
    myResults.set(new ArrayList<String>());
}

// use it later in your code
@Test
public void myTestCase() {
     myResults.get().add("result");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多