Junit单元测试

测试分类

  1. 黑盒测试:不需要写代码,给输入值,看程序能否得到输出期望值.
  2. 白盒测试:需要些代码,关注程序具体的执行流程.

Junit的使用

  • 步骤

    1. 定义一个测试类(测试用例).
    2. 定义测试方法,可以独立运行.
    3. 给方法加@Test.
    4. 导入junit依赖环境.
  • 判断结果
    • 红色:失败
    • 绿色:成功
    • 一般使用断言操作来处理结果.
      • Assert.assertEquals(期望的结果,运行的结果);
  • 补充
    • @Before:修饰的方法会在测试方法之前自动执行.
    • @After:修饰的方法会在测试之后自动执行.
package Junit_Demo;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class demo1 {
@Before
public void init()
{
System.out.println("init...");
} @Test
public void test1()
{
int a=2;
int b=3;
int c=a+b;
System.out.println(c);
} @Test
public void test2()
{
int a=2;
int b=3;
int c=a+b; //断言:如果两个不相等,则失败.
Assert.assertEquals(3,c);
System.out.println(c);
} @After
public void close()
{
System.out.println("after...");
}
}

反射:框架设计的灵魂

定义

  • 框架:半成品软件,可以在框架的基础上进行软件开发,简化代码量.
  • 反射:将类的各个组成部分封装为其他对象,这就是反射机制.
    • 好处

      1. 可以在程序运行过程中,操作这些对象.
      2. 可以解耦,提高程序的可扩展性.

获取Class对象的方式

  1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象.

    • 多用于配置文件,将类名定义在配置文件中,读取文件,加载类.
  2. 类名.class:通过类名的属性class获取.
    • 多用于参数的传递.
  3. 对象.getClass():在Object类中定义.
    • 多用于对象的获取字节码方式.

结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个.

Class对象的功能

获取功能

  1. 获取成员变量

    1. Field[] getFields():获取所有public修饰的成员变量
    2. Field getField(String name):获取指定名称的public修饰的成员变量.
    3. Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符.
    4. Field getDeclaredField(String name):获取指定名称的成员变量.
  2. 获取构造方法
    1. Constructor<?>[] getConstructors()
    2. Constructor<T> getConstructor(类<?>... parameterTypes)
    3. Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
    4. Constructor<?>[] getDeclaredConstructors()
  3. 获取成员方法
    1. Method[] getMethods()
    2. Method getMethod(String name, 类<?>... parameterTypes)
    3. Method[] getDeclaredMethods()
    4. Method getDeclaredMethod(String name, 类<?>... parameterTypes)
  4. 获取全类名
    • String getName()

Field:成员变量

  • 操作

    1. 设置值

      • void set(Object obj,Object value):第一个参数是设置的对象,第二个参数是值.
    2. 获取值
      • get(Object obj):参数表示获取的对象.
    3. 忽略权限修饰符的安全检查:setAccessible(true)暴力反射.

Constructor:构造方法

  • 创建对象

    • T newInstance(Object... initargs)
    • 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法.

Method:方法对象

  • 执行方法:Object invoke(Object obj,Object... args):第一个参数是要执行方法的对象.后面的参数是方法的参数.
  • 获取方法名称:String getName:获取方法名.
  • User对象
package Reflect_Demo;

public class User {
private String name;
private int age; public User(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
} public void Sleep()
{
System.out.println("睡觉...");
}
}
  • 反射案例
package Reflect_Demo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; public class demo1 {
public static void main(String[] args) throws Exception {
Class<User> userClass = User.class;
Constructor<User> constructor = userClass.getConstructor(String.class, int.class);
User user = constructor.newInstance("zhangsan", 15);
Method sleep = userClass.getMethod("Sleep");
sleep.invoke(user);
Field name_Field = userClass.getDeclaredField("age");
name_Field.setAccessible(true);
System.out.println(user);
name_Field.set(user,25);
System.out.println(user);
}
}

静态方法

静态代码块

    static {
System.out.println("static_block");
}

程序加载入内存之后,只会被执行一次.

静态方法

    public static void print_static()
{
System.out.println("static_print");
}

可以使用类直接调用方法.

  • 静态代码定义
public class static_block {
static {
System.out.println("static_block");
}
public void print()
{
System.out.println("public_print");
}
public static void print_static()
{
System.out.println("static_print");
}
}
  • 使用静态方法
    public static void main(String[] args) {
try {
Class.forName("Reflect_Demo.static_block");// 静态代码块
static_block.print_static();// 静态方法
static_block static_block = new static_block();
static_block.print();// 公共方法 } catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

Junit测试和反射的更多相关文章

  1. junit测试延伸--私有方法测试

    关于junit测试的延伸,这里有类概念级别的测试,继承类的测试,接口的测试,抽象类的测试,关于这些类级别的测试,这里我就不做多的赘述了. 关于上面的几个测试就是说,我们不应该单纯的去测试类中的一些方法 ...

  2. Java基础加强笔记——测试、反射、注解

    目录 1. Junit单元测试 2. 反射 3. 注解 Junit单元测试: 测试分类: 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值. 2. 白盒测试:需要写代码的.关注程序具 ...

  3. 复利计算器(软件工程)及Junit测试———郭志豪

    计算:1.本金为100万,利率或者投资回报率为3%,投资年限为30年,那么,30年后所获得的利息收入:按复利计算公式来计算就是:1,000,000×(1+3%)^30 客户提出: 2.如果按照单利计算 ...

  4. Junit测试框架 Tips

    关于Junit测试框架使用的几点总结: 1.Junit中的测试注解: @Test →每个测试方法前都需要添加该注解,这样才能使你的测试方法交给Junit去执行. @Before →在每个测试方法执行前 ...

  5. junit测试,使用classpath和file 加载文件的区别

    用junit测试发现一个问题,怎么加载配置文件?一直都出现这样的错误 ERROR: org.springframework.test.context.TestContextManager - Caug ...

  6. Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法

    一.单元测试的目的 简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功能,修改bug),都可以做到重新测试的工作.以减少我们在发布的时候出现更过甚至 ...

  7. 单元测试实战 - Junit测试

    一.对加法函数进行测试 1.实例化被测单元(方法):类名 实例名=new 类名([参数]) 2.调用被测单元,对比预期值和输出值(实际值): 在没有junit测试工具的情况下,我们要进行如下的测试代码 ...

  8. Android Junit测试框架

    对应用进行单元测试: 使用Junit测试框架,是正规Android开发的必用技术.在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性. 1.配置指令集和函数库: (1)配置指令集,指定 ...

  9. 在Eclipse中生成接口的JUnit测试类

    在Spring相关应用中,我们经常使用“接口” + “实现类” 的形式,为了方便,使用Eclipse自动生成Junit测试类. 1. 类名-new-Other-java-Junit-Junit Tes ...

随机推荐

  1. 【electron-playground系列】打包优化之路

    作者:梁棒棒 简介 electron打包工具有两个:electron-builder,electron-packager,官方还提到electron-forge,其实它不是一个打包工具,而是一个类似于 ...

  2. SQL注入及如何解决

    SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗 ...

  3. SVN 使用教程 命令 visual studio 使用SVN

    首先推荐大家一个应该是国内外最好的SVN仓库,不限私有,不限成员:https://svnbucket.com/ SVN官网 https://tortoisesvn.net/downloads.html ...

  4. Java与C#

    Java和C#都是编程的语言,它们是两个不同方向的两种语言 相同点: 他们都是面向对象的语言,也就是说,它们都能实现面向对象的思想(封装,继承,多态) 区别: 1.c#中的命名空间是namespace ...

  5. easyui中加载table列表数据 第一次有数据第二次没有数据问题

    $('#allUsingProductTable').datagrid({  加载数据时,第二加载时table会发生变化会出现找不到问题.如果是弹框没有影响,弹框出现出现列表每次都会执行销毁方法. 解 ...

  6. [LeetCode]662. Maximum Width of Binary Tree判断树的宽度

    public int widthOfBinaryTree(TreeNode root) { /* 层序遍历+记录完全二叉树的坐标,左孩子2*i,右孩子2*i+1 而且要有两个变量,一个记录本层节点数, ...

  7. 学习Promise异步编程

    JavaScript引擎建立在单线程事件循环的概念上.单线程( Single-threaded )意味着同一时刻只能执行一段代码.所以引擎无须留意那些"可能"运行的代码.代码会被放 ...

  8. 项目中同一个页面引入不同的jQuery版本的不冲突问题

    在写项目的过程中,如果需要使用jQuery时,时长会遇到需要引入不同版本的jQuery,可能上一个负责该项目的人用到的是老版本的jQuery,而你去添加功能时用的是新版本的,这个问题很难避免掉,如果去 ...

  9. 腾讯IOT安卓开发初探

    目录 腾讯IOT 安卓开发初探 Tecent IOT 开发平台的使用 新建项目 创建产品 添加自定义功能 设备开发 微信小程序配置 面板配置 新建设备 使用设备 安卓开发 前置配置 data.json ...

  10. 注意力论文解读(1) | Non-local Neural Network | CVPR2018 | 已复现

    文章转自微信公众号:[机器学习炼丹术] 参考目录: 目录 0 概述 1 主要内容 1.1 Non local的优势 1.2 pytorch复现 1.3 代码解读 1.4 论文解读 2 总结 论文名称: ...