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. [打基础]luogu1957口算练习题——字符串基本操作

    题意:第一行给出数据组数n,之后n行每行给出三个或两个数据,若给三个数据,则第一个数据用单个字符a/b/c分别表示+/-/*运算,后两个数表示参与运算的数字,若给两个数据延续之前的运算 要求对每行数据 ...

  2. 【剑指offer】00 开撸剑指offer

    此篇为刷题链接集合,我会将剑指offer中的每一题单独做一篇随笔,然后将链接加在本篇随笔中. //将用JavaScript解题 剑指offer:https://www.nowcoder.com/ta/ ...

  3. matlab多项式拟合以及指定函数拟合

    clc;clear all;close all;%% 多项式拟合指令:% X = [1 2 3 4 5 6 7 8 9 ];% Y = [9 7 6 3 -1 2 5 7 20]; % P= poly ...

  4. 返回前端页面的属性名称和实体类的名称不一致用@JsonProperty

    场景:比如前端要求你返回一个json数据类型,但是这个json类型的里面属性有的值重复了,比如 { name:zhangsan, age:12, teacher:[ name:Mrs Liu subj ...

  5. 【代码周边】MongoDB与Mysql对比以及插入稳定性分析(指定主键的影响)

    在数据库存放的数据中,有一种特殊的键值叫做主键,它用于惟一地标识表中的某一条记录.也就是说,一个表不能有多个主键,并且主键不能为空值. 无论是MongoDB还是MySQL,都存在着主键的定义. 对于M ...

  6. 在Ubuntu14.04下配置Samba 完成linux和windows之间的文件共享

    在Windows和Linux之间传递文件可以使用Samba服务.下面是安装步骤: 1. 安装Samba. sudo apt-get install samba 2. 修改配置文件 sudo gedit ...

  7. Java Tree 树 数据结构

    说到树结构就不得不回顾 链表结构 https://www.cnblogs.com/easyidea/p/13371863.html 如果链表结构中再多一个指针会是什么情况? 是不是像树根一样,这就是 ...

  8. Spring Cloud Config应用篇(九)

    一.SpringCloud Config 配置中心 1.1.配置中心说明 SpringCloud Config 服务器以下简称"配置中心". Spring Cloud Config ...

  9. 如何在K8S中优雅的使用私有镜像库 (Docker版)

    前言 在企业落地 K8S 的过程中,私有镜像库 (专用镜像库) 必不可少,特别是在 Docker Hub 开始对免费用户限流之后, 越发的体现了搭建私有镜像库的重要性. 私有镜像库不但可以加速镜像的拉 ...

  10. 所有CSS字体属性

    font(在一个声明中设置所有的字体属性) font-family(指定文本的字体系列) font-size(指定文本的字体大小) font-style(指定文本的字体样式) font-variant ...