在写测试用例的时候,突然很疑惑,为什么我只是加了一个@Test的注解,就能运行一个程序。我们知道,main方法才是一个java程序的起点。那junit4的测试用例是怎么跑起来的呢。
为了解决这个疑惑,我就自己写测试用例debug调试了下。
测试用例如下:
package com.onlyou.olyfinance.remote.base; import org.junit.Test; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; /** * 模拟dubbo消费端远程调用进行测试 * Created by cd_huang on 2016/12/26. */ @ContextConfiguration(locations = { "classpath:test/spring/appCtx-dubbo.xml" }) public class BaseServiceTestRemote extends AbstractJUnit4SpringContextTests { @Test public void testRun() { System.out.println("run~~~~~~"); } }
用intellij运行后,在System.out.println("run~~~~~~")处设置断点,然后我们直接看方法调用:
"main@1" prio=5 tid=0x1 nid=NA runnable java.lang.Thread.State: RUNNABLE at com.onlyou.olyfinance.remote.base.BaseServiceTestRemote.testRun(BaseServiceTestRemote.java:16) at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) at org.junit.runner.JUnitCore.run(JUnitCore.java:160) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:119) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
程序的起点:at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)。
说明是IDE的集成了junit插件,这也是为什么我们没有些main方法为什么能运行程序的原因。
看一下JUnitCore的run()方法:
public Result run(Runner runner) { Result result = new Result(); RunListener listener = result.createListener(); fNotifier.addFirstListener(listener); try { fNotifier.fireTestRunStarted(runner.getDescription()); runner.run(fNotifier); fNotifier.fireTestRunFinished(result); } finally { removeListener(listener); } return result; }debug后查看runner的实际类型是SpringJUnit4ClassRunner:
相关推荐
标题“gs-test-task”可能指的是一个测试任务,很可能在IT领域中,这涉及到软件开发、自动化测试或性能评估。由于没有具体的描述,我们将基于通常的IT测试任务来探讨相关知识点。 在IT行业中,测试任务是确保软件...
"DSi-Coding-Test" 是一个针对数据结构与算法(DSi)的编码测试项目,主要使用Java语言进行编程。这个项目可能包含了若干个挑战性的编程问题,旨在检验开发者在处理复杂数据处理和算法实现方面的技能。让我们深入...
它通过类(class)的方式组织测试用例,但需要注意的是,unittest有一个关联模块unittest2,该模块仅适用于Python2.4-2.6版本。从Python2.7开始,unittest增加了一些新的特性,因此在后续版本中,unittest成为了唯一的...
"FEUP-LPOO"是一个与Java编程相关的学习资源,可能源自葡萄牙波尔图大学(FEUP)的"Logic for Programming, Artificial Intelligence and Reasoning"(LPOO)课程。这个项目可能是为了帮助学生理解和实践面向对象...
【标题】"Datos1-Proyecto1" 是一个与Java编程相关的项目,可能是一个课程作业或者是一个小型的应用程序。从项目名称来看,它可能涉及到数据处理或数据分析的第一部分,"Datos1"暗示了对数据的初步操作,而"Proyecto...
【标题】"TallerParcialJ1"是一个与Java编程相关的项目或作业,可能是某个教育机构或个人学习者为了提升Java编程技能而设立的一次部分练习。从标题来看,这可能是一个系列的一部分,专注于Java语言的基础知识或者...
在这个特定的项目中,团队可能已经创建了一个Java应用程序或服务。 【描述】描述信息简洁,没有提供具体项目详情。通常,黑客马拉松项目可能涵盖了各种主题,如数据分析、物联网、移动应用、游戏开发等,而...
在解压"SbsChilcaMala-master"后,我们通常会看到一个包含源代码文件夹(如src)、资源文件夹(如res)、配置文件(如config)、测试目录(如test)、构建脚本(如build.gradle或pom.xml)等的标准Java项目结构。...
标题 "Grupo2" 提供的信息有限,但考虑到标签是 "Java",我们可以推测这是一个与 Java 相关的项目或者学习小组。"Grupo2-master" 可能是项目的主分支或者顶级目录,暗示这是一个版本控制下的代码仓库,可能使用了 ...
"Chitstop"看起来是一个基于Java的项目,很可能是一个软件工具或者框架,但具体功能由于提供的信息有限,无法确切得知。下面我会根据标题、描述以及与Java相关的标签,来探讨一些可能涉及的Java编程和软件开发知识点...
7. **Test Automation Framework Design**: 设计一个可扩展和可复用的自动化测试框架,包括测试数据管理、异常处理和测试报告生成。 8. **版本控制**: 使用Git进行代码版本控制,协同开发,确保团队成员的工作同步...
`BudgetBuddy`是一个专为个人和家庭设计的财务管理应用程序,旨在帮助用户有效地跟踪和控制他们的支出,从而实现更好的财务规划。这个项目与`AVAST`相关,可能意味着它曾经或正在作为`AVAST`安全软件的一个组件进行...
标题“Com_Ven:固态硬盘项目”表明这是一个与固态硬盘(SSD)相关的软件开发项目,可能涉及固态硬盘的管理、优化或者数据处理。项目名称中的“Com_Ven”可能是项目缩写或者特定的命名约定,具体含义可能需要根据项目...