`
xiangshouxiyang
  • 浏览: 49456 次
  • 性别: 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
分享到:
评论

相关推荐

    基于SSM的教师管理系统.rar

    SSM(Spring、SpringMVC、MyBatis)是一个经典的Java web开发框架组合,用于构建高效、灵活的企业级应用程序。这个“基于SSM的教师管理系统”项目源码提供了实现一个全面管理教师信息的Web应用实例。下面将详细介绍...

    基于SSM企业车辆.rar

    4. **微信小程序**:项目的标签中提到了微信小程序,这意味着该系统可能还包含了一个微信小程序端,以便用户通过微信进行车辆信息的查看和管理。微信小程序的开发涉及小程序的API调用、页面结构定义(WXML和WXSS)、...

    20220103.基于SSM会议管理系统的设计与实现.rar

    这个系统不仅提供了完整的源码,而且可能还包括小程序端的实现,这为学习者提供了一个全面了解和实践企业级应用开发的机会。下面将详细阐述该项目中的关键知识点。 1. **Spring框架**:Spring是Java领域最流行的IoC...

    基于SSM的智乐健身后台.rar

    4. **项目结构**:一个典型的SSM项目通常包含多个模块,如service层(业务逻辑)、dao层(数据访问)、model层(实体类)、controller层(控制层)、以及配置文件等。在“智乐健身后台”的源码中,我们可以看到这些...

    基于ssm的大学生综合素质评分平台.rar

    8. **单元测试与集成测试**:为了保证代码质量,开发者可能会使用JUnit和Mockito等工具对各个模块进行单元测试,以及使用Spring Boot的Test Slice功能进行集成测试。 9. **前端界面**:虽然主要讨论的是SSM后端,但...

    20220136.基于Java EE“陕西农特产品”网络交易平台设计与实现ssm.rar

    该项目是基于Java EE技术栈,特别是SSM框架(Spring、Spring MVC、MyBatis)实现的一个"陕西农特产品"网络交易平台。以下是该平台设计与实现的一些关键知识点: 1. **Spring框架**:Spring作为核心容器,管理着应用...

    2021033003_数独联网对战APP.rar

    标题中的"2021033003_数独联网对战APP.rar"表明这是一个关于数独游戏的互联网对战应用程序的压缩文件,很可能包含该应用的源代码和其他相关资源。描述与标题相同,没有提供额外的信息,但我们可以根据标签来推测更多...

    gs-test-task

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

    DSi-Coding-Test

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

    2021032202_基于Java的在线影评网站系统.rar

    这是一个基于Java技术实现的在线影评网站系统的毕业设计项目。这个项目主要涵盖了Web开发的核心技术和概念,旨在为用户提供一个可以浏览、评论电影的互动平台。下面将详细解析这个项目的相关知识点。 1. **Java Web...

    基于SSM的ssm停车场管理系统hsg9226W8B8系统.rar

    SSM(Spring、SpringMVC、MyBatis)是一个经典的Java web开发框架组合,广泛应用于企业级应用开发,尤其在构建复杂业务系统时表现出高效、灵活的优势。本项目"基于SSM的ssm停车场管理系统hsg9226W8B8系统"是基于这个...

    2021031613_基于Java的医院预约挂号平台系统的设计与实现.rar

    综上所述,这个基于Java的医院预约挂号平台系统是一个涵盖了后端开发、前端设计、数据库管理、安全性、性能优化等多个方面知识的综合性项目,对于学习和理解现代Web应用程序的开发流程有着重要的实践意义。

    Python 测试框架unittest和pytest的优劣

    它通过类(class)的方式组织测试用例,但需要注意的是,unittest有一个关联模块unittest2,该模块仅适用于Python2.4-2.6版本。从Python2.7开始,unittest增加了一些新的特性,因此在后续版本中,unittest成为了唯一的...

    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编程和软件开发知识点...

Global site tag (gtag.js) - Google Analytics