黑马全套Java教程(十)(一)

简介: 黑马全套Java教程(十)

38 单元测试

单元测试:针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法,因此,单元测试就是针对Java方法的测试,进而检查方法的正确性

目前测试方法是怎么进行的,存在什么问题:

  • 只有一个main方法,如果一个方法的测试失败了,其他方法测试会受到影响
  • 无法得到测试的结果报告,需要程序员自己去观察测试是否成功
  • 无法实现自动化测试

Junit单元测试框架:JUnit是使用Java语言实现的单元测试框架,它是开源的,Java开发者都应当学习并使用JUnit编写单元测试。此外,几乎所有的IDE工具都继承了JUnit,这样我们就可以直接在IDE中编写并运行JUnit,这样我们就可以直接在IDE中编写并运行JUnit测试,JUnit目前最新版本是。

JUnit优点

  1. JUnit可以灵活的选择执行哪些测试方法,可以一键执行全部测试方法。
  2. Junit可以生成全部方法的测试报告。
  3. 单元测试中的某个方法测试失败了,不会影响其他测试方法的测试。

UserService.java

//业务方法
public class UserService {
    public String loginName(String loginName, String passWord){
        if("admin".equals(loginName) && "123456".equals(passWord)){
            return "登录成功!";
        } else{
            return "用户名或密码出错!";
        }
    }
    public void selectNames(){
        System.out.println(10/0);
        System.out.println("查询全部用户名成功!");
    }
}

TestUserService.java

import org.junit.Assert;
import org.junit.Test;
//测试类
public class TestUserService {
    /*测试方法
        注意点
            1、必须是公开的,无参数,无返回值的方法
            2、测试方法必须使用@Test注解标记
     */
    @Test
    public void testLoginName(){
        UserService userService = new UserService();
        String rs = userService.loginName("admin", "123456");
        //进行预期结果的正确性测试:断言
        Assert.assertEquals("您的功能业务可能出现问题", "登录成功!", rs);
    }
    @Test
    public void testSelectNames(){
        UserService userService = new UserService();
        userService.selectNames();
    }
}

import jdk.jfr.BooleanFlag;
import org.junit.*;
//测试类
public class TestUserService {
    //修饰实例方法的
    @Before
    public void before(){
        System.out.println("===before方法执行一次===");
    }
    @After
    public void after(){
        System.out.println("===after方法执行一次===");
    }
    //修饰静态方法
    @BeforeClass
    public static void beforeClass(){
        System.out.println("===beforeClass方法执行一次===");
    }
    @AfterClass
    public static void afterClass(){
        System.out.println("===afterClass方法执行一次===");
    }
    /*测试方法
        注意点
            1、必须是公开的,无参数,无返回值的方法
            2、测试方法必须使用@Test注解标记
     */
    @Test
    public void testLoginName(){
        UserService userService = new UserService();
        String rs = userService.loginName("admin", "123456");
        //进行预期结果的正确性测试:断言
        Assert.assertEquals("您的功能业务可能出现问题", "登录成功!", rs);
    }
    @Test
    public void testSelectNames(){
        UserService userService = new UserService();
        userService.selectNames();
    }
}
===beforeClass方法执行一次===
===before方法执行一次===
===after方法执行一次===
===before方法执行一次===
5
查询全部用户名成功!
===after方法执行一次===
===afterClass方法执行一次===




39 动态代理

Star.java

package d9_proxy;
public class Star implements Skill{
    private String name;
    public Star(String name){
        this.name = name;
    }
    @Override
    public void jump(){
        System.out.println(name + "跳舞");
    }
    @Override
    public void sing(){
        System.out.println(name + "唱歌");
    }
}

Skill接口

package d9_proxy;
public interface Skill {
    void jump();
    void sing();
}

StarAgentProxy.java

package d9_proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class StarAgentProxy {
    //设计一个方法来返回一个明星对象的代理对象
    public static Skill getProxy(Star obj){
        //为杨超越这个对象,生成一个代理对象
        return (Skill) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("收首付款。。。");
                        //真正的让杨超越去唱歌和跳舞。。。
                        //method  正在调用的方法对象    args代表这个方法的参数
                        Object rs = method.invoke(obj, args);
                        System.out.println("收尾款。。。");
                        return rs;
                    }
                });
    }
}

Test.java

package d9_proxy;
//目标:学习开发出一个动态代理的对象出来,理解动态代理的执行流程
public class Test {
    public static void main(String[] args) {
        //1. 创建一个对象(杨超越)  对象的类必须实现接口
        Star s = new Star("杨超越");
        // 为杨超越对象,生成一个代理对象(经纪人)
        Skill s2 = StarAgentProxy.getProxy(s);
        s2.jump();
        s2.sing();
    }
}


UserService.java

package d10_proxy2;
public interface UserService {
    String login(String loginName, String passWord);
    void deleteUser();
    String selectUsers();
}

UserServiceImpl.java

package d10_proxy2;
public class UserServiceImpl implements UserService{
    @Override
    public String login(String loginName, String passWord) {
        String rs = "登录名和密码错误";
        if("admin".equals(loginName) && "123456".equals(passWord)){
            rs = "登录成功";
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return rs;
    }
    @Override
    public void deleteUser() {
        try {
            System.out.println("您正在删除用户数据中。。。");
            Thread.sleep(2500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    @Override
    public String selectUsers() {
        String rs = "查询了10000个用户数据。。。";
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return rs;
    }
}

ProxyUtil.java

package d10_proxy2;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyUtil {
    //通过一个静态方法,为用户业务对象返回一个代理对象
    public static UserService getProxy(UserService obj){
        return (UserService) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        long startTime = System.currentTimeMillis();
                        //真正触发对象的行为执行的
                        Object rs = method.invoke(obj, args);
                        long endTime = System.currentTimeMillis();
                        System.out.println(method.getName() + "方法耗时:" +  (endTime - startTime) / 1000.0 + "s");
                        return rs;
                    }
                });
    }
}

Test.java

package d10_proxy2;
//掌握使用动态代理解决问题,理解使用动态代理的优势
public class Test {
    public static void main(String[] args) {
        UserService userService = ProxyUtil.getProxy(new UserServiceImpl());
        System.out.println(userService.login("admin", "123456"));
        System.out.println(userService.selectUsers());
        userService.deleteUser();
    }
}


黑马全套Java教程(十)(二)+https://developer.aliyun.com/article/1556524

目录
相关文章
|
2天前
|
存储 Java 编译器
Java基础教程(五千字带你快速入门!)(二)
Java基础教程(五千字带你快速入门!)(二)
|
13小时前
|
XML 测试技术 数据格式
《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)
【7月更文挑战第3天】TestNG教程展示了如何自定义日志记录。首先创建一个名为`TestLog`的测试类,包含3个测试方法,其中一个故意失败以展示日志。使用`Assert.assertTrue`和`Reporter.log`来记录信息。接着创建`CustomReporter`类,继承`TestListenerAdapter`,覆盖`onTestFailure`, `onTestSkipped`, 和 `onTestSuccess`,在这些方法中自定义日志输出。
17 6
|
1天前
|
Java 测试技术 Android开发
《手把手教你》系列基础篇(八十四)-java+ selenium自动化测试-框架设计基础-TestNG日志-上篇(详解教程
【7月更文挑战第2天】TestNG是一个用于自动化测试的Java框架,提供日志记录功能。日志有两种模式:底层级详细记录每个步骤,高层级仅记录关键事件。示例代码展示了如何在测试方法中使用`Reporter.log()`记录信息,这些信息会显示在TestNG HTML报告中。文章还提及了日志显示时可能出现的编码问题及解决办法。
|
2天前
|
XML 存储 JavaScript
黑马全套Java教程(十)(二)
黑马全套Java教程(十)
5 0
|
2天前
|
存储 Java
黑马全套Java教程(九):网络编程(四)
黑马全套Java教程(九):网络编程
9 0
|
2天前
|
网络协议 Java
黑马全套Java教程(九):网络编程(三)
黑马全套Java教程(九):网络编程
8 0
|
2天前
|
Java
黑马全套Java教程(九):网络编程(二)
黑马全套Java教程(九):网络编程(二)
9 0
|
2天前
|
安全 Java
黑马全套Java教程(九):网络编程(一)
黑马全套Java教程(九):网络编程(一)
11 0
|
2天前
|
XML 测试技术 数据格式
《手把手教你》系列基础篇(八十三)-java+ selenium自动化测试-框架设计基础-TestNG测试报告-下篇(详解教程)
【7月更文挑战第1天】使用TestNG自定义报告的简要说明: - TestNG提供默认的HTML和XML报告,但可通过实现IReporter接口创建自定义报告。 - 自定义报告器类需扩展`CustomReporter.java`,实现`generateReport()`方法,接收XML套房、测试结果及输出目录作为参数。
13 0
|
安全 Java 程序员
4月7日云栖精选夜读:给 Java 学习者的超全教程整理
作为Java程序员的我们,应该不仅对这门语言有所了解,而且我们在平常编程时也需要使用众多的库。比如小编知道的,如果要学习Java Web的话,SSH(Spring, Struts和Hibernate)肯定得会吧,或者至少了解基本的原理吧。
2743 0