注解,JUnit

一、注解

1、什么是注解?
注解可以简单理解为标注的解释,或者有人也称为注释。
但是因为说注释,容易和  单行注释和多行注释 混淆,所以更多人就称为注解。
把它叫做注释,是因为它有“解释说明”的作用。
例如:@Override 是一个注解,它的作用就有说明它标注的方法是一个“重写”的方法。

但是和我们之前用的“单行注释和多行注释”还有点不同。
单行注释和多行注释:给人看的,Java程序是忽略它的。
注解:既能给人看,还能被Java程序读取。所以也把注解称为代码级别的注释,相当于用代码去注释代码。

2、注解长什么样?
在Java程序中用 @开头,后面加类型名字,就是一个注解。

3、系统中的常见注解有这些?
(1)@Override:标注某个方法是一个“重写”的方法。
如果加上@Override,编译器会检测这个重写方法的格式是否满足重写的要求。

方法重写的要求:
   方法名:必须相同
   形参列表:必须相同
   返回值类型:
        基本数据类型和void:必须相同
        引用数据类型:<=
    权限修饰符:>=
            不能是private,跨包还不能是缺省的
    其他的修饰符:不能是static,final。

(2)@SuppressWarnings:抑制xx警告
(3)@Deprecated:标记某个类、方法等已过时,请不要再使用了,否则可能有问题。

4、一个完整的注解应该有3个部分组成:
(1)声明注解:和类、方法等一样,需要先声明后使用
具体的声明格式,反射章节再说
(2)注解的使用(绝大多数程序员都只是使用注解)

(3)注解的读取
一个注解使用后,必须配合注解的读取,才会变的有意义,否则没有任何意义。

@Override扥系统注解,由编译器来读取了。
    例如:编译器读取到某个方法上面,标记了@Override,那么就会执行对应的一段代码(这个代码的作用就是检查方法是否符合重写的要求)。
                            如果方法上面没有标记,那么就会执行另一段代码(这个代码的作用就检查方法是否符合xx的要求)。

public class TestAnnotation {
    public static void main(String[] args) {
        //日期
        Date date = new Date(2021,8,17);
        System.out.println(date);
        //Sat Sep 17 00:00:00 CST 3921

        Date date2 = new Date(2021-1900,8-1,17);
        System.out.println(date2);
        //Tue Aug 17 00:00:00 CST 2021
    }
}
//自定义注解,后面反射部分再说
@interface MyAnnotation{}

@MyAnnotation
@SuppressWarnings("unused")
class Father{
    public void method(){
        System.out.println("父类的方法");
    }
    public void print1n(){
        System.out.println("父类的print1n方法");
    }
    public void test(int a){
        System.out.println("父类的test方法");
    }
    public String fun(){
        System.out.println("父类的fun方法");
        return "";
    }
    public static void fang(){
        System.out.println("父类的静态方法fang");
    }
}
@SuppressWarnings("unused")
class Son extends Father{
    @Override
    public void method() {
        System.out.println("子类重写父类的方法");
    }
/*
    //方法名不同
    @Override
    public void println(){
        System.out.println("子类重写父类的println方法");
    }

    //形参列表不同
    @Override
    public void test(){
        System.out.println("重写父类的test方法");
    }

    //返回值类型没有满足<=的要求
    @Override
    public Object fun(){
        System.out.println("子类重写父类的fun方法");
        return new Object();
    }

    //违反了修饰的要求,static不能重写
    @Override
    public static void fang(){
        System.out.println("子类重写父类的静态方法fang");
    }*/
}

二、文档注释
1、文档注释以 /**开头,而多行注释以/*开头,结果都一样。
 * 文档注释的作用除了给人看以外,可以给 “javadoc.exe”程序工具读取,并生成API文档。

2、先在程序中编写文档注释,然后用IDEA的Tools菜单下-> Generate JavaDoc...
生成API文档。
需要指定:
(1)生成API的代码范围,是整个工程,还是模块,还得单独某个文件
(2)生成API文档的存储路径
(3)设置一下字符编码的参数
Locale语言环境可以选项:zh_CN
-encoding utf8 -charset utf8 -docencoding utf8

3、要求
@param表示方法的形参,有形参就写,没有形参就不写,有几个形参写几个@param。
    @param 形参名 形参数据类型 形参的说明
@return表示方法的返回值信息,方法的返回值类型是void,就不写,不是void就需要写
    @return 返回值类型  说明信息

@throws或@exception 表示方法执行过程中可能发生的异常,有就写,没有就不写
    @throws或@exception 异常类型  说明信息
上面三个是用在方法上的。

其他的:
@author表示作者
@since表示从哪个版本开始
@see另请参阅
 */

/**
 * 文档注释演示
 *
 * @author Irene
 * @since 1.8
 * @version 1.0
 */

public class TestJavaDoc {
    /**
     * 这是Java的主方法,是Java程序的入口
     * @param args String[] 命令行参数,在用java命令运行时,使用java 主类名 参数值1  参数值2 ...的格式传入实参
     */
    public static void main(String[] args) {
        System.out.println("hello javadoc");
    }

    /**
     * 求两个整数相除
     * @param a int 被除数
     * @param b int 除数
     * @return int 商,只保留整数部分
     * @throws  ArithmeticException 当除数b为0时,就会发生算术异常
     */
    public int divide(int a, int b) throws ArithmeticException{
        return a/b;
    }
}

三、JUnit
1、简单介绍
它是第三方的一个框架,用来编写单元测试。
程序员自测一般称为白盒测试,相当于盒子是透明的,因为程序员对自己写的代码是清楚,然后看它的功能等要求是否满足。
测试人员测试一般称为黑盒测试,相当于盒子是密封不可见的,因为测试人员并不清楚你的代码如何实现,他是照着需求文档,设计文档等文档进行测试,
            测试功能需求,安全需求,性能瓶颈等方面,并把结果反馈给开发人员。

  开发人员在公司当做主要沟通的人:
  (1)产品经理及其团队
  (2)自己的开发团队
  (3)测试团队

2、JUnit如何使用?
第一步:因为JUnit是第三方的框架,所以需要在咱们的项目中引入对应的库(jar)
      有网,可以直接从Maven仓库中直接下载
      断网,可能需要通过本地的方式引入。

      当我们使用@Test等JUnit中的一些注解时,会提示我们需要引入相对应的库,单击它下载即可。
      默认下载到C盘 Maven仓库中。

第二步:
    可以在需要测试的方法上面加@Test注解,然后就可以运行这个方法

要求:
(1)你自己的同一个包下面,不能有叫做Test的类,强烈建议
(2)包含测试方法的类必须是public的
(3)包含测试方法的类必须是有无参构造的
Test class should have exactly one public zero-argument constructor
(4)测试方法本身必须是public,void,无参的
Method test should have no parameters
Method test() should be void
Method test() should be public


为什么?因为JUnit的代码和我们写的代码不是一个包,如果我们测试类和测试方法不是公共的,
        那么JUnit就无法创建我们测试类的对象,调用测试方法,因为跨包不可见。
        因为JUnit是通过“反射”来创建测试类的对象,并且是用无参构造来创建对象,所以我们必须提供无参构造。
        因为JUnit只是负责运行我们的测试方法,不会主动给我们的测试方法传参数和处理返回值,所以测试方法只能是无参和无返回值的。
(5)标记@Test的测试方法,不能是静态的
Method test() should not be static

3、除了@Test,还有一些其他注解
@BeforeClass:用在静态方法上,并且该方法只运行一次,在所有 测试方法之前运行
@AfterClass:用在静态方法上,并且该方法只运行一次,在所有 测试方法之后运行
@Before:和@Test一样用在非静态方法上,在每一个@Test的方法前运行
@After:和@Test一样用在非静态方法上,在每一个@Test的方法后运行

4、运行JUnit的程序,如果是在类上面单击运行按钮,那么所有测试方法都会运行。
                   如果是单击某个@Test方法的运行按钮,只运行这一个测试方法。

5、JUnit的@Test方法和main方法是有区别
(1)默认情况下,@Test不支持键盘输入
需要在IDEA的配置文件中,加一句参数设置,才能支持键盘输入
方式一:Help菜单-->Edit Custom VM Options...-->如果第一次单击这个,会询问是否创建这个,
    相当于在C盘的C:\Users\final(当前操作系统登录的用户名)\.IntelliJIdea2019.2\config下生成一个配置文件idea64.exe.vmoptions
在配置文件最后新的一行加
-Deditable.java.test.console=true
配置完成之后,重启IDEA

方式二:如果C盘的C:\Users\final(当前操作系统登录的用户名)\.IntelliJIdea2019.2\config下没有配置文件idea64.exe.vmoptions,
    也可以直接找到IDEA安装目录下的bin目录(D:\ProgramFiles\JetBrains\IntelliJ_IDEA_2019.2.3\bin)中的idea64.exe.vmoptions文件,
在配置文件最后新的一行加
-Deditable.java.test.console=true
配置完成之后,重启IDEA

注意,第二种方式,仅限于C判断没有idea64.exe.vmoptions的才有用,否则不起作用。
建议,软件的配置文件请用Notepad++软件打开进行设置,某些其他软件打开配置文件修改后会修改文件编码或给文件加(BOM头等信息)导致软件启动错误。

(2)@Test对多线程的支持不同(后面多线程再说)

public class TestJUnit {
    @BeforeClass
    public static void beforeClassTest(){
        System.out.println("start");
    }

    @AfterClass
    public static void afterClassTest(){
        System.out.println("end");
    }

    @Before
    public void before(){
        System.out.println("before");
    }

    @After
    public void after(){
        System.out.println("after");
    }

    @Test
    public void test1(){
        System.out.println("test1");
    }

    @Test
    public void test2(){
        System.out.println("test2");
    }

    @Test
    public void test3(){
        System.out.println("test3");
        Scanner input = new Scanner(System.in);
        System.out.print("请输入一个整数:");
        int num = input.nextInt();
        System.out.println("num = " + num);
    }
}

Spring JUnit 注解测试是一种基于 Spring 框架的单元测试方法,通过使用注解来实现依赖注入、AOP、事务控制等功能,从而方便地进行单元测试。 下面是 Spring JUnit 注解测试常用的注解及其作用: 1. @RunWith(SpringJUnit4ClassRunner.class):指定运行测试的类为 SpringJUnit4ClassRunner,该类会创建 Spring 的上下文环境,并自动加载指定的配置文件或配置类。 2. @ContextConfiguration:指定 Spring 的配置文件或配置类,用于创建 Spring 的上下文环境。 3. @Autowired:自动装配 Spring 容器中的 Bean,可以省略 setter 方法。 4. @Transactional:在测试方法中添加该注解可以实现事务控制,测试方法执行完成后自动回滚事务。 5. @Test:用于标记测试方法。 下面是一个简单的 Spring JUnit 注解测试的例子: ```java @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = AppConfig.class) @Transactional public class UserServiceTest { @Autowired private UserService userService; @Test public void testAddUser() { User user = new User(); user.setUsername("test"); user.setPassword("123456"); userService.addUser(user); User addedUser = userService.getUserByName("test"); Assert.assertEquals("test", addedUser.getUsername()); } } ``` 在该例子中,@RunWith 指定了运行测试的类为 SpringJUnit4ClassRunner,@ContextConfiguration 指定了需要加载的配置类 AppConfig,@Transactional 用于进行事务控制,@Autowired 实现了依赖注入,@Test 标记了测试方法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值