`
xiangshouxiyang
  • 浏览: 48187 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

junit 4只是简单的加了一个@Test,程序是怎么跑起来的

阅读更多

    在写测试用例的时候,突然很疑惑,为什么我只是加了一个@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

 


 那么,
SpringJUnit4ClassRunner这个类是怎么来的。

我们的测试用例的父类是抽象类AbstractJUnit4SpringContextTests,源码如下:

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class })
public abstract class AbstractJUnit4SpringContextTests implements ApplicationContextAware {
 ...
}

    也就是,ide的junit插件在运行时会实例化@RunWith注解对应的类,把测试用例的类和方法的信息附带上。

然后中间有很多的代码,比如去获得@Rule,@Before,@After等Statement配置去实用junit的强大功能。

最终就是通过反射调用我们的测试用例。

    由于本人水平有限,没有对junit4做更较真的研究,有兴趣了解更多的人可以看这篇博客:http://www.jianshu.com/p/ad524e211ef3

  • 大小: 51.3 KB
分享到:
评论

相关推荐

    gs-test-task

    标题“gs-test-task”可能指的是一个测试任务,很可能在IT领域中,这涉及到软件开发、自动化测试或性能评估。由于没有具体的描述,我们将基于通常的IT测试任务来探讨相关知识点。 在IT行业中,测试任务是确保软件...

    DSi-Coding-Test

    "DSi-Coding-Test" 是一个针对数据结构与算法(DSi)的编码测试项目,主要使用Java语言进行编程。这个项目可能包含了若干个挑战性的编程问题,旨在检验开发者在处理复杂数据处理和算法实现方面的技能。让我们深入...

    FEUP-LPOO

    "FEUP-LPOO"是一个与Java编程相关的学习资源,可能源自葡萄牙波尔图大学(FEUP)的"Logic for Programming, Artificial Intelligence and Reasoning"(LPOO)课程。这个项目可能是为了帮助学生理解和实践面向对象...

    Datos1-Proyecto1

    【标题】"Datos1-Proyecto1" 是一个与Java编程相关的项目,可能是一个课程作业或者是一个小型的应用程序。从项目名称来看,它可能涉及到数据处理或数据分析的第一部分,"Datos1"暗示了对数据的初步操作,而"Proyecto...

    TallerParcialJ1

    【标题】"TallerParcialJ1"是一个与Java编程相关的项目或作业,可能是某个教育机构或个人学习者为了提升Java编程技能而设立的一次部分练习。从标题来看,这可能是一个系列的一部分,专注于Java语言的基础知识或者...

    uethackathon2015_team14

    在这个特定的项目中,团队可能已经创建了一个Java应用程序或服务。 【描述】描述信息简洁,没有提供具体项目详情。通常,黑客马拉松项目可能涵盖了各种主题,如数据分析、物联网、移动应用、游戏开发等,而...

    SbsChilcaMala

    在解压"SbsChilcaMala-master"后,我们通常会看到一个包含源代码文件夹(如src)、资源文件夹(如res)、配置文件(如config)、测试目录(如test)、构建脚本(如build.gradle或pom.xml)等的标准Java项目结构。...

    Grupo2

    标题 "Grupo2" 提供的信息有限,但考虑到标签是 "Java",我们可以推测这是一个与 Java 相关的项目或者学习小组。"Grupo2-master" 可能是项目的主分支或者顶级目录,暗示这是一个版本控制下的代码仓库,可能使用了 ...

    chitstop

    "Chitstop"看起来是一个基于Java的项目,很可能是一个软件工具或者框架,但具体功能由于提供的信息有限,无法确切得知。下面我会根据标题、描述以及与Java相关的标签,来探讨一些可能涉及的Java编程和软件开发知识点...

    web-logistics-standard:物流标准版自动化测试

    7. **Test Automation Framework Design**: 设计一个可扩展和可复用的自动化测试框架,包括测试数据管理、异常处理和测试报告生成。 8. **版本控制**: 使用Git进行代码版本控制,协同开发,确保团队成员的工作同步...

    BudgetBuddy:AVAST 测试任务存储库

    `BudgetBuddy`是一个专为个人和家庭设计的财务管理应用程序,旨在帮助用户有效地跟踪和控制他们的支出,从而实现更好的财务规划。这个项目与`AVAST`相关,可能意味着它曾经或正在作为`AVAST`安全软件的一个组件进行...

    Com_Ven:固态硬盘项目

    标题“Com_Ven:固态硬盘项目”表明这是一个与固态硬盘(SSD)相关的软件开发项目,可能涉及固态硬盘的管理、优化或者数据处理。项目名称中的“Com_Ven”可能是项目缩写或者特定的命名约定,具体含义可能需要根据项目...

Global site tag (gtag.js) - Google Analytics