使用runners来检查当前是否运行junit测试类

在项目中编写单元测试类的时候,很多地方需要用到token,而这个token是启动web项目才会生成的。所以为了动态获取token,就编写了一个http工具类来根据写死的url地址注入bean来生成,但是这样就会导致每次启动web项目的时候都会去执行,而我想要的是只在测试的时候去解析。
那怎么办呢?就是根据线程堆栈信息来判断当前是否存在junit这条线程,如果存在,那么再执行解析方法。

public static boolean isRunningTest() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        for (StackTraceElement stackTraceElement : stackTrace) {
            String stackString = stackTraceElement.toString();
            if (stackString.lastIndexOf("junit.runners") > -1) {
                return true;
            }
        }
        return false;
    }

这里为什么是"junit.runners"呢?
Runner是Junit中的一个抽象类

public abstract class Runner implements Describable {
    public Runner() {
    }

    public abstract Description getDescription();

    public abstract void run(RunNotifier var1);

    public int testCount() {
        return this.getDescription().testCount();
    }
}

可以通过@Runwith注解来设置一个Runner要执行的测试。
JUnit测试的启动是通过使用JUnitCore类实现的。也可以通过使用命令行,或者使用JUnitCore各种run()方法中的一个(这种方式就是IDE开发工具在你点击run test按钮的时候做的工作)来启动。比如:

JUnitCore.runClasses(MyTestClass.class);

然后JUnitCore使用反射来为传递的测试类找到一个合适的Runner。其中的一个步骤就是查找测试类上的@RunWith注解。如果没有找到其他的Runner,将使用默认的Runner(BlockJUnit4ClassRunner)。Runner将被实例化,测试类会被传递给Runner。然后Runner就会实例化传进来的测试类,然后运行。
而这个runners便是执行runner的线程。
当然,针对上面的问题还有一个解决办法,就是编写一个类,然后使用@BeforeClass执行前置逻辑以及@AfterClass执行后置逻辑,让测试类继承这个类即可。需要注意的是,使用这两个注解的方法必须声明成public static,原因也很简单,每次执行@Test注解的方法就相当于创建一个实例,而在运行@BeforeClass和@AfterClass注解的方法时,测试类还没有实例化。执行顺序:@BeforeClass>@Before>@Test>@AfterClass>@After

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
若要使用 JUnit 进行测试,需要遵循以下步骤: 1. 在你的项目中添加 JUnit 依赖库,可以通过 Maven 或 Gradle 等构建工具进行添加。 2. 创建一个测试,该必须使用 `@RunWith` 注解,并指定 JUnit运行器,通常为 `org.junit.runners.JUnit4.class`。 3. 在测试中,编写测试方法,并使用 `@Test` 注解标注该方法,以便 JUnit 运行器能够识别该方法为测试方法。 4. 在测试方法中,编写测试代码并进行断言,以验证测试结果是否符合预期。 5. 在 IDE 中运行测试,或者通过构建工具进行测试JUnit 将自动运行所有标注了 `@Test` 注解的测试方法,并输出测试结果。 下面是一个简单的 JUnit 测试的示例: ```java import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class CalculatorTest { @Test public void testAdd() { Calculator calculator = new Calculator(); int result = calculator.add(2, 3); Assert.assertEquals(5, result); } @Test public void testDivide() { Calculator calculator = new Calculator(); double result = calculator.divide(10, 2); Assert.assertEquals(5.0, result, 0.0); } } ``` 在上面的示例中,我们定义了一个名为 Calculator 的,该包含两个方法:add 和 divide。我们创建了一个名为 CalculatorTest测试使用 JUnit4 运行器,并在该中编写了两个测试方法:testAdd 和 testDivide。在这些测试方法中,我们创建了 Calculator 对象,并调用其中的方法,然后使用断言来验证测试结果是否符合预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值