Day43-Java基础之单元测试和注解

2024-05-15 22:28

本文主要是介绍Day43-Java基础之单元测试和注解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 单元测试Junit

1.1 什么是单元测试?(掌握)

对部分代码进行测试。

1.2 Junit的特点?(掌握)

  • 是一个第三方的工具。(把别人写的代码导入项目中)(专业叫法:导jar包)

  • 如果运行结果显示绿色,表示运行结果是正确的。

    如果运行结果显示红色,表示运行结果是错误的。

1.3 基本用法:(掌握)

1,一定要先写一个方法。

2,在这个方法的上面写@Test

3,鼠标点一下@Test 按alt + 回车,点击Junit4

此时就可以自动导包。

如果自动导包失败(连接外网,或者自己手动导包)

如果导包成功在左下角就会出现Junit4的相关jar包

手动导包(掌握)

1,在当前模块下,右键新建一个文件夹(lib)

2,把今天资料里面的两个jar包,拷贝到lib文件夹里面

3,选中两个jar右键点击add as a lib....

4,到代码中,找到@Test,按alt + 回车,再来导入。

运行测试代码(掌握)

  • 只能直接运行无参无返回值的非静态方法

  • 想要运行谁,就右键点击哪个方法。如果想要运行一个类里面所有的测试方法,选择类名,有点点击即可。

Junit正确的打开方式(正确的使用方式)(掌握)

注意点:并不是直接在要测试的方法上面直接加@Test

原因:因为要测试的方法有可能是有参数的,有返回值,或者是静态的。

正确的使用方式:(掌握)

1,新建测试类

2,新建测试方法(要测试的方法名 + Test) methodTest

3,在这个方法中直接调用要测试的方法

4,在测试方法的上面写@Test

代码示例:

//真正用来测试的类
//测试用例(测试类)
public class JunitTest {
​//在这个类里面再写无参无返回值的非静态方法//在方法中调用想要测试的方法
​@Testpublic void method2Test(){//调用要测试的方法JunitDemo1 jd = new JunitDemo1();jd.method2(10);}
}

实际开发中单元测试的使用方式(掌握)

需求:测试File中的delete方法,写的是否正确(掌握)

开发中的测试原则:

不污染原数据。

代码示例:

public class JunitDemo3 {//在实际开发中,真正完整的单元测试该怎么写?//前提://以后在工作的时候,测试代码不能污染原数据。(修改,篡改)//1.利用Before去对数据做一个初始化的动作//2.利用Test真正的去测试方法//3.利用After去还原数据//需求:测试File类中的delete方法是否书写正确???@Beforepublic void beforemethod() throws IOException {//先备份File src = new File("C:\\Users\\moon\\Desktop\\a.txt");File dest = new File("C:\\Users\\moon\\Desktop\\copy.txt");
​FileInputStream fis = new FileInputStream(src);FileOutputStream fos = new FileOutputStream(dest);int b;while((b = fis.read()) != -1){fos.write(b);}fos.close();fis.close();}
​//作为一个标准的测试人员,运行完单元测试之后,不能污染原数据//需要达到下面两个要求://1.得到结果//2.a.txt还在而且其他的备份文件消失@Testpublic void method(){File file = new File("C:\\Users\\moon\\Desktop\\a.txt");boolean delete = file.delete();
​//检查a.txt是否存在boolean exists = file.exists();
​//只有同时满足了下面所有的断言,才表示delete方法编写正确Assert.assertEquals("delete方法出错了",delete,true);Assert.assertEquals("delete方法出错了",exists,false);}
​
​@Afterpublic void aftermethod() throws IOException {//还要对a.txt做一个还原File src = new File("C:\\Users\\moon\\Desktop\\copy.txt");File dest = new File("C:\\Users\\moon\\Desktop\\a.txt");
​FileInputStream fis = new FileInputStream(src);FileOutputStream fos = new FileOutputStream(dest);int b;while((b = fis.read()) != -1){fos.write(b);}fos.close();fis.close();
​//备份数据要删除src.delete();
​}
}

作业:

测试Properties类中的store方法是否书写正确?

开发心得:

1.Before 准备数据

2.Test 测试方法

3.After 还原

Before

准备数据
1.创建Properties的对象
2.put数据到集合当中
//只不过在下面的方法中,我们也需要用到Properties的对象,所以写完之后要挪到成员位置

Test

调用store方法,保存数据到本地文件
​
断言1:判断当前文件是否存在
断言2:文件的大小一定是大于0
断言3:再次读取文件中的数据,判断是否跟集合中一致
​
结论:如果所有的断言都通过了,表示store方法是正确的

After

把本地文件给删除

扩展点:

在单元测试中,相对路径是相对当前模块而言的。

代码示例:

File file = new File("aweihaoshuai.txt");
file.createNewFile();
//此时是把aweihaoshuai.txt这个文件新建到模块中了。

1. 注解

1.1 注释和注解的区别?(掌握)

共同点:都可以对程序进行解释说明。

不同点:注释,是给程序员看的。只在Java中有效。在class文件中不存在注释的。

当编译之后,会进行注释擦除。

注解,是给虚拟机看的。当虚拟机看到注解之后,就知道要做什么事情了。

##1.2 如何使用注解(掌握)

在以前看过注解@Override。

当子类重写父类方法的时候,在重写的方法上面写@Override。

当虚拟机看到@Override的时候,就知道下面的方法是重写的父类的。检查语法,如果语法正确编译正常,如果语法错误,就会报错。

1.3 Java中已经存在的注解(掌握)

@Override:表示方法的重写

@Deprecated:表示修饰的方法已过时

@SuppressWarnings("all"):压制警告

除此之外,还需要掌握第三方框架中提供的注解:

比如:Junit

@Test 表示运行测试方法

@Before 表示在Test之前运行,进行数据的初始化

@After 表示在Test之后运行,进行数据的还原

1.4 自定义注解(了解)

自定义注解单独存在是没有什么意义的,一般会跟反射结合起来使用,会用发射去解析注解。

针对于注解,只要掌握会使用别人已经写好的注解即可。

关于注解的解析,一般是在框架的底层已经写好了。

1.5 特殊属性(掌握)

value:

当注解中只有"一个属性",并且属性名是"value",使用注解时,可以省略value属性名

代码示例:

//注解的定义
public @interface Anno2 {public String value();
​public int age() default 23;
}
​
//注解的使用
@Anno2("123")
public class AnnoDemo2 {
​@Anno2("123")public void method(){
​}
}

1.6 元注解(了解)

可以写在注解上面的注解

@Target :指定注解能在哪里使用

@Retention :可以理解为保留时间(生命周期)

Target:

作用:用来标识注解使用的位置,如果没有使用该注解标识,则自定义的注解可以使用在任意位置。

可使用的值定义在ElementType枚举类中,常用值如下

  • TYPE,类,接口

  • FIELD, 成员变量

  • METHOD, 成员方法

  • PARAMETER, 方法参数

  • CONSTRUCTOR, 构造方法

  • LOCAL_VARIABLE, 局部变量

Retention:

作用:用来标识注解的生命周期(有效范围)

可使用的值定义在RetentionPolicy枚举类中,常用值如下

  • SOURCE:注解只作用在源码阶段,生成的字节码文件中不存在

  • CLASS:注解作用在源码阶段,字节码文件阶段,运行阶段不存在,默认值

  • RUNTIME:注解作用在源码阶段,字节码文件阶段,运行阶段

注解的解析:

1.7 模拟JUnit自带的@Test注解(了解)

代码示例:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}
​
public class MyTestMethod {
​@MyTestpublic void method1(){System.out.println("method1");}
​public void method2(){System.out.println("method2");}
​@MyTestpublic void method3(){System.out.println("method3");}
}
​
public class MyTestDemo {public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {//1,获取class对象Class clazz = Class.forName("com.itheima.test2.MyTestMethod");
​//获取对象Object o = clazz.newInstance();
​//2.获取所有方法Method[] methods = clazz.getDeclaredMethods();for (Method method : methods) {//method依次表示类里面的每一个方法method.setAccessible(true);//判断当前方法有没有MyTest注解if(method.isAnnotationPresent(MyTest.class)){method.invoke(o);}}}
}

1.8 注解小结:

掌握如何使用已经存在的注解即可。

@Override:表示方法的重写

@Deprecated:表示修饰的方法已过时

@SuppressWarnings("all"):压制警告

@Test:表示要运行的方法

在以后的实际开发中,注解是使用框架已经提供好的注解。

自定义注解+解析注解(很难的,了解),一般会出现在框架的底层。当以后我们要自己写一个框架的时候,才会用到自定义注解+解析注解。

这篇关于Day43-Java基础之单元测试和注解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993091

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]