day18 单元测试、动态代理、logback、log4j

目录

一、单元测试

二、动态代理

三、logback

3.1 概述

3.2 日志记录与System.out区别

3.3 生成日志

3.4 logback的组件

3.5 SLF4J


一、单元测试

junit测试框架:
    由apache提供的一种测试框架,可以简化测试代码的编写
    
    使用:
        1.导入junitjar包
        2.定义测试类
            类名规范:被测试类名+Test
        3.定义测试方法
            权限修饰符:public
            返回值类型:void
            方法名:test+被测试方法名
            参数列表:空
            
        4.在测试方法上添加@Test注解
        
        5.运行测试方法

三个常用注解 Before Test After

@Test   //在要测试的方法上加上@Test注解

@Before注解: //添加该注解的方法,在所有测试方法执行之前执行,一般用来初始化资源(加载配置文件)

@After注解: //添加该注解的方法,在所有测试方法执行之后执行,一般用来释放资源

junit中有一个类 Assert.assertXxxx(期望值,实际值);判断期望值是否和计算机程序得到的实际值一直,如果不一致会报错

1. 测试类

public class MyMathTest {

@Before//测试开始之前执行
    public void aa(){
        System.out.println("测试开始之前执行,一般用来执行初始化的动作");
    }
    /*
    1.权限修饰符: public
    2.返回值类型:void
    3.方法名: 一般是  test + 被测试的方法名
    4.参数列表必须为: 空
     */

    @Test
    //在要测试的方法上加上@Test注解
    public void testAdd() {
        MyMath myMath = new MyMath();
        int result = myMath.add(1, 3);

        //使用断言机制,将来可以自动判断测试通过与否
        //junit中有一个类  Assert.assertXxxx(期望值,实际值);
        Assert.assertEquals(4,result);//不一致报错
        /*
            java.lang.AssertionError:
            Expected :8
            Actual   :4
         */
    }
    @After//测试完成之后执行
    public void bb(){
        System.out.println("测试完成之后执行,一般用来执行释放资源的动作");
    }
}

2. 自定义类

public class MyMath {

    public int add(int a,int b){
        return a+b;
    }
    public int sub(int a,int b){
        return a-b;
    }
}

二、动态代理

2.1 设计模式

设计模式:
    设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 

2.2 常见设计模式

常见设计模式(23种):
    适配器模式(Adapter Pattern)
    桥接模式(Bridge Pattern)
    过滤器模式(Filter、Criteria Pattern)
    装饰器模式(Decorator Pattern)
    模板模式(Template Pattern)
    代理模式(Proxy Pattern)
    ......

2.3 代理模式

解决的问题:
         在不修改源码的基础上,对功能(方法)进行增强

三要素:
         共用接口:为了规定代理对象和被代理对象有共同的行为(方法)
         被代理对象:背后真正做事情的对象
         代理对象:与用户打交道的对象,会调用被代理对象完成功能

 实现:
         1.定义接口
         2.创建被代理对象
         3.创建代理对象
         4.用户调用代理对象完成功能

案例

1. 测试类

代码示例

public class Test {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
        //2.创建被代理对象
        //利用匿名内部类
        Seller lenovo = new Seller() {

            @Override
            public String sellComputer(int money) {
                System.out.println(money + "元买了一台电脑");
                return "送p10";
            }

            @Override
            public void fixComputer(int money) {
                System.out.println(money + "元修了电脑");
            }
        };

        //3.创建代理对象
         /*
        public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h) {
         */
         //3.1 因为创建代理对象里面的参数需要一个Class类型的接口数组,所以先创建数组
        //获取Seller的class对象放进数组
        Class[] interfaces = {Seller.class};
        Seller proxy = (Seller) Proxy.newProxyInstance(
                ClassLoader.getSystemClassLoader(),
                interfaces,
                new InvocationHandler() {
                    /*
            ClassLoader loader:提供一个类加载器,加载动态代理对象对应的类(你看不到),固定书写:ClassLoader.getSystemClassloader();
            Class[] interfaces:制定动态代理对象实现的接口们,固定书写:Class[] interfaces = {Seller.class};
            InvocationHandler h:处理器,当用户使用动态代理对象调用了方法后,处理逻辑的地方
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //要对被代理对象的功能 sellComputer 进行增强
                        /*
                            参数
                            方法体
                            返回值
                         */
                        //1.获取方法名
                        String methodName = method.getName();
                        //2.判断
                        if("sellComputer".equals(methodName)){
                            //进行增强
                            //2.1 车接
                            System.out.println("阿帕奇接来");
                            //2.2卖电脑
                            //对参数进行增强
                            int money = (int) args[0];
                            args[0]= money-200;
                            //运行方法并接收返回值
                            Object result = method.invoke(lenovo, args);

                            //2.3车接
                            System.out.println("三蹦子送走");

                            //输出sellComputer方法的返回值
                            return result+"再送1辆保时捷";
                        }else {
                            Object result = method.invoke(lenovo, args);
                            return result;
                        }
                    }
                }
        );
        //用户调用代理对象
        String money = proxy.sellComputer(9000);
        System.out.println(money);
        proxy.fixComputer(100);
    }
}
            //打印结果
            /*
                阿帕奇接来
                8800元买了一台电脑
                三蹦子送走
                送p10再送1辆保时捷
                100元修了电脑
            */

改写else方法体

}else {
    method.invoke(lenovo, args);
                            
      }
   return true;

 2. 自定义接口

public interface Seller {
    String sellComputer(int money);
    void fixComputer(int money);
}

三、logback

3.1 概述

logback是一种专门用于Java程序记录日志的工具,是目前主流的开发日志技术。

3.2 日志记录与System.out区别

System.out记录的信息无法进行删除,一旦写入,必须运行。日志记录的信息可以根据使用需要,设置是否显示日志,设置记录日志的级别,并且记录相关所有信息。

3.3 生成日志

获取记录器使用如下方式:

private static final Logger logger = LoggerFactory.getLogger(Tester.class); 

这个方法在使用前需要导入 slf4j-api-x.x.x.jar这个包

案例

public class Demo {
    private static final Logger logger = LoggerFactory.getLogger(Demo.class);

    public static void main(String[] args) throws IOException {

        logger.info("程序开始执行");
        int sum = 0;
        for (int i = 0; i <= 10; i++) {
            logger.info("第" + i + "次执行");
            sum += i;
        }
        logger.info("和为" + sum);
        logger.info("程序结束执行");

    }
}

 控制台输出

2022-02-28 17:32:16 [main] INFO  com.日志.Demo - 程序开始执行
2022-02-28 17:32:16 [main] INFO  com.日志.Demo - 第0次执行
2022-02-28 17:32:16 [main] INFO  com.日志.Demo - 第1次执行
2022-02-28 17:32:16 [main] INFO  com.日志.Demo - 第2次执行
2022-02-28 17:32:16 [main] INFO  com.日志.Demo - 第3次执行
2022-02-28 17:32:16 [main] INFO  com.日志.Demo - 第4次执行
2022-02-28 17:32:16 [main] INFO  com.日志.Demo - 第5次执行
2022-02-28 17:32:16 [main] INFO  com.日志.Demo - 第6次执行
2022-02-28 17:32:16 [main] INFO  com.日志.Demo - 第7次执行
2022-02-28 17:32:16 [main] INFO  com.日志.Demo - 第8次执行
2022-02-28 17:32:16 [main] INFO  com.日志.Demo - 第9次执行
2022-02-28 17:32:16 [main] INFO  com.日志.Demo - 第10次执行
2022-02-28 17:32:16 [main] INFO  com.日志.Demo - 和为55
2022-02-28 17:32:16 [main] INFO  com.日志.Demo - 程序结束执行

3.4 logback的组件

logger组件在此系统中被从高到低分为五个级别:分别用来指定这条日志信息的重要程度。

ERROR(错误)
WARN(警告)
INFO(信息)
DEBUG(调试)
TRACE(跟踪)

logback有一个规则:只输出级别不低于设定级别的日志信息。假设Loggers级别设定为INFO,则INFO、WARN、ERROR级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。

3.5 SLF4J

意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接口方法进行调用即可,由于它只是一个接口,并不是一个具体的可以直接单独使用的日志框架,所以最终日志的格式、记录级别、输出方式等都要通过接口绑定的具体的日志系统来实现,这些具体的日志系统就有log4j,logback等,它们才实现了具体的日志系统的功能。

好处: 在不修改代码的情况下将 logback 日志系统替换成 log4j。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值