You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在另一个类中调用JUnit两个测试类的测试方法?

在另一个类中调用JUnit测试方法的几种方式

嘿,我来帮你搞定这个问题!首先得说清楚:直接调用JUnit的@Test方法不是框架的常规用法,但如果你确实有这个需求,下面几种方案可以试试,同时也会给你更合理的替代思路。

方案1:直接实例化测试类调用方法(简单但不推荐)

因为你的测试方法都是public的,所以最直接的方式就是创建测试类的实例,然后直接调用方法。比如写一个调用类:

public class TestInvoker {
    public static void main(String[] args) {
        // 调用CheckFilter的测试方法
        CheckFilter filterTest = new CheckFilter();
        filterTest.Run_filter_test();
        
        // 调用CheckVideoPlays的测试方法
        CheckVideoPlays videoTest = new CheckVideoPlays();
        videoTest.Play_video_in_full();
    }
}

⚠️ 注意:这种方式不会触发JUnit的生命周期注解(比如@Before、@After、@BeforeClass),如果你的测试方法依赖这些注解初始化的资源,那测试可能会失败。

方案2:用JUnit官方API执行测试(规范且支持生命周期)

如果需要完整触发JUnit的测试生命周期,推荐用框架提供的API来执行测试,分JUnit 4和JUnit 5两种情况:

针对JUnit 4

可以用JUnitCore类来运行指定的测试方法:

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class JUnit4TestRunner {
    public static void main(String[] args) {
        // 运行整个测试类的所有方法
        Result result = JUnitCore.runClasses(CheckFilter.class, CheckVideoPlays.class);
        
        // 打印执行结果
        for (Failure failure : result.getFailures()) {
            System.out.println(failure.toString());
        }
        System.out.println("测试是否通过:" + result.wasSuccessful());
    }
}

如果只想运行特定方法,可以自定义Request:

import org.junit.runner.Request;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;

public class JUnit4SpecificMethodRunner {
    public static void main(String[] args) {
        Request request = Request.method(CheckFilter.class, "Run_filter_test")
                .with(Request.method(CheckVideoPlays.class, "Play_video_in_full"));
        Result result = new JUnitCore().run(request);
        
        // 处理结果逻辑
    }
}

针对JUnit 5(JUnit Jupiter)

用JUnit Platform的Launcher API来执行指定测试方法:

import org.junit.platform.launcher.Launcher;
import org.junit.platform.launcher.LauncherDiscoveryRequest;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.core.LauncherFactory;
import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
import org.junit.platform.launcher.listeners.TestExecutionSummary;

import static org.junit.platform.engine.discovery.DiscoverySelectors.selectMethod;

public class JUnit5TestRunner {
    public static void main(String[] args) {
        SummaryGeneratingListener listener = new SummaryGeneratingListener();
        
        // 构建要执行的测试方法请求
        LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
                .selectors(
                        selectMethod(CheckFilter.class, "Run_filter_test"),
                        selectMethod(CheckVideoPlays.class, "Play_video_in_full")
                )
                .build();
        
        // 执行测试并获取结果
        Launcher launcher = LauncherFactory.create();
        launcher.registerTestExecutionListeners(listener);
        launcher.execute(request);
        
        // 打印执行摘要
        TestExecutionSummary summary = listener.getSummary();
        summary.printTo(System.out);
    }
}

更推荐的最佳实践:提取核心逻辑到工具类

其实直接调用测试方法是绕远路的做法,JUnit测试的职责是验证业务逻辑,而不是被其他代码调用。更好的方式是把测试里的核心业务逻辑提取到独立的工具类/业务类中:

比如,先把CheckFilter里的过滤逻辑抽出来:

// 新的工具类,存放核心逻辑
public class FilterService {
    public void executeFilter() {
        // 原来CheckFilter测试方法里的核心代码
    }
}

然后测试类变成:

public class CheckFilter {
    private FilterService filterService = new FilterService();
    
    @Test
    public void Run_filter_test() {
        filterService.executeFilter();
        // 这里只保留断言和验证逻辑
    }
}

同样处理视频播放的逻辑,提取出VideoPlayService:

public class VideoPlayService {
    public void playFullVideo() {
        // 原来Play_video_in_full里的核心代码
    }
}

之后,在任何需要调用这些逻辑的类里,直接使用FilterService和VideoPlayService就可以了,既清晰又符合代码设计原则。

内容的提问来源于stack exchange,提问作者Saffik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:09:23