【Java 强化】单元测试(JUnit3、JUnit4)、XML(语法、约束

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

我们这里就是对单元测试有个简单认识,会简单利用 3 和 4 编写一些测试代码。

测试环境搭建:将 junit 的测试 jar,添加到该项目中。

在这里插入图片描述

使用 junit3.x(了解)

junit3.x 是 Java5 以前的测试方式。

测试步骤:

  1. 把 junit3.x 的测试 jar,添加到项目中;

  2. 定义一个测试类,并让该测试类继承 TestCase

测试类的名字:XxxTestXxx 表示一个对象或者一个模块、组件。

  1. EmployeeDAOTest 中编写测试方法;

方法是 public 修饰,无返回值无参数的。

必须以 test 作为方法的前缀,Xxx 表示测试的功能名字。

public void testXxx() throws Exception {}

  1. 选择某一个测试方法,鼠标右键选择 [run as junit]

或者选中测试类,表示测试该类中所有的测试方法。

  • 若要在测试方法之前做准备操作:

EmployeeDAOTest 覆写 TestCaseprotected void setUp() throws Exception 方法;

  • 若要在测试方法之后做回收操作:

EmployeeDAOTest 覆写 TestCaseprotected void tearDown() throws Exception 方法;

  • 测试执行顺序: setUp -> 测试方法 -> tearDown -> setUp -> 测试方法2 -> tearDown

示例:利用 JUnit3 编写 EmployeeDAOTest 的测试类。

package com.yusael._01_junit.junit3;

import junit.framework.TestCase;

// EmployeeDAO组件的测试类

public class EmployeeDAOTest extends TestCase {

@Override // 初始化操作

protected void setUp() throws Exception {

System.out.println(“初始化操作”);

}

@Override // 销毁操作

protected void tearDown() throws Exception {

System.out.println(“销毁操作”);

}

// 测试员工的保存操作

public void testSave() throws Exception {

System.out.println(“保存测试”);

}

// 测试员工的删除操作

public void testDelete() throws Exception {

System.out.println(“删除测试”);

}

}

在这里插入图片描述

使用 junit4.x(掌握)

junit4.x 基于 Java5 开始的版本,支持注解

步骤:

  1. 把 junit4.x 的测试 jar,添加到项目中;;

  2. 定义一个测试类。(不再继承 TestCase 类)

测试类的名字: XxxTest

  1. EmployeeDAOTest 中编写测试方法;

方法是 public 修饰的,无返回的

该方法上必须贴有 @Test 标签,Xxx 表示测试的功能名字。

@Test

public void testXxx() throws Exception {}

  1. 选择某一个测试方法,鼠标右键选择 [run as junit]

或者选中测试类,表示测试该类中所有的测试方法。

以后单元测试使用最多的方式:

  • 若要在测试方法之前做准备操作:

EmployeeDAOTest 随意定义一个方法并使用 @Before 标注;

每次执行测试方法之前都会执行 @Before 标注的方法

@Before

public void xx() throws Exception {}

  • 若要在测试方法之后做回收操作:

EmployeeDAOTest 随意定义一个方法并使用 @After 标注;

每次执行测试方法之后都会执行 @After 标注的方法;

@After

public void xx() throws Exception {}

  • 有没有方式只初始化一次,和最终只销毁一次呢?

@BeforeClass 标签:在所有的 Before 方法之前执行,只在最初执行一次, 只能修饰静态方法

@AfterClass 标签:在所有的 After 方法之后执行,只在最后执行一次,只能修饰静态方法

  • 测试执行顺序:BeforeClass -> (Before -> Test -> After -> … ) -> AfterClass

示例:利用 JUnit4 编写 EmployeeDAOTest 的测试类。

package com.yusael._01_junit.junit4;

import org.junit.After;

import org.junit.AfterClass;

import org.junit.Before;

import org.junit.BeforeClass;

import org.junit.Test;

// EmployeeDAO组件的测试类

public class EmployeeDAOTest {

@BeforeClass

public static void staticInit() throws Exception {

System.out.println(“static - Init”);

}

@AfterClass

public static void staticDestroy() throws Exception {

System.out.println(“static - Destroy”);

}

@Before

public void Init() throws Exception {

System.out.println(“初始化操作”);

}

@After

public void Destory() throws Exception {

System.out.println(“销毁操作”);

}

@Test

public void testSave() throws Exception {

System.out.println(“保存测试”);

}

@Test

public void testDelete() throws Exception {

System.out.println(“删除测试”);

}

}

在这里插入图片描述

使用断言方式(了解)

这个不是很常用,只需要了解即可。

期望值: 断言时希望是多少。

真实值: 程序内部运算之后实际是多少。

断言成功: 期望值和真实值相同,此时显示绿条。

断言失败: 期望值和真实值不同,此时显示红条。

断言

  • Assert.assertEquals(message, expected, actual):比较的值

message:断言失败的提示信息,断言成功不会显示

expected:期望值

actual:真实值

若真实值和期望值想等,则断言成功 —> 绿条

  • Assert.assertSame(message, expected, actual):比较地址,断言是同一个对象

Assert.assertNotSame(message, expected, actual):断言不是同一个对象

  • Assert.assertTrue(message, condition):断言 condition 应该为 TRUE

Assert.assertFalse(message, condition):断言 condition 应该为 FALSE

  • Assert.assertNull(message, object):断言对象 object 为 null

Assert.assertNotNull(message, object):断言对象 object 不为 null

  • @Test(expected=ArithmeticException.class):期望该方法抛出 ArithmeticException 异常

  • @Test(timeout=400):期望该方法在400毫秒之内执行完成

示例:利用断言进行对数学方法类进行测试。

package com.yusael._01_junit.asserted;

/**

  • 数学运算功能

  • @author yusael

*/

public interface IMath {

/**

  • 两个数相加

  • @param a 加数

  • @param b 加数

  • @return 两个数之和

*/

int add(int a, int b);

/**

  • 两个数之商(考虑整除)

  • @param a 被除数

  • @param b 除数

  • @return 商

*/

int divide(int a, int b);

}

package com.yusael._01_junit.asserted.impl;

import com.yusael._01_junit.asserted.IMath;

public class MathImpl implements IMath {

@Override

public int add(int a, int b) {

return a + b;

}

@Override

public int divide(int a, int b) {

return a / b;

}

}

package com.yusael._01_junit.asserted;

import org.junit.Test;

import com.yusael._01_junit.asserted.impl.MathImpl;

import junit.framework.Assert;

// Math测试类

public class MathTest {

// 依赖关系

private IMath math = new MathImpl();

@Test

public void testAdd() {

int ret = math.add(1, 2);

Assert.assertEquals(3, ret);

}

@Test

public void testDivide() {

int ret = math.divide(6, 2);

Assert.assertEquals(3, ret);

}

// 期望抛出ArithmeticException异常, 不抛则测试不通过

@Test(expected=ArithmeticException.class)

public void testException() {

math.divide(2, 0); // 抛出ArithmeticException异常, 测试通过

}

}

在这里插入图片描述

XML 以及约束

===========================================================================

XML(eXtensible Markup Language),是一种可扩展的标记语言,类似 HTML。

XML技术是W3C组织(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范。

XML被广泛认为是继Java之后在Internet上最激动人心的新技术。

XML的树状结构简单,清晰,无论是人还是计算机都能轻松解析。

XML作为一种公订的、开放的标准,不受知识产权的限制。

HTML: 显示页面,网页. 学习里面自带的标签

XML: 传输数据,而非显示数据

XML标签没有被预定义,需要用户自行定义标签。

为什么要学XML:

  • XML是一种通用的数据交换格式;

  • 许多项目都采用XML作为数据交换格式;

  • 掌握XML是软件开发人员的一项基本技能;

Struts、Spring、Hibernate、Mybatis 等任意一个 Java EE 框架中都可用XML做配置文件。

XML语法


XML有两个编码: 内容编码、文件本身的编码;要保证两个编码相同,都为 UTF-8。

一个XML文档必须有且仅有一个根标签不允许标签嵌套区分大小写

在编写XML文档时,

  • 需要先使用文档声明来声明XML文档,且必须出现在文档的第一行。

最简单的语法,如:<?xml version="1.0"?>

  • encoding 属性说明文档所使用的字符编码,默认为 UTF-8。

保存在磁盘上的文件编码要与声明的编码一致。

如:<?xml version="1.0" encoding="UTF-8"?>

  • standalone 属性说明文档是否独立,即是否依赖其他文档。

如:<?xml version=”1.0” standalone=”yes”?>

CDATA 是 Character Data 的缩写:

  • 作用:把标签当做普通文本内容;

解析器不对 CDATA 区中的内容进行解析,而是将这些数据原封不动地交给程序去处理。

  • 语法:<![CDATA[数据内容]]>

xml 一般情况下不会要求去写,大致看得懂即可

<?xml version="1.0" encoding="UTF-8"?>

Will

iwiller@qq.com

成都

叩丁狼教育

Stef

lanyotech@qq.com

成都

叩丁狼教育

DTD 约束(了解)


在这里插入图片描述

Scheme 约束(了解)


在这里插入图片描述

DOM

======================================================================

DOM(Document Object Model):文档对象模型

  • 使用面问对象的方式,把 XML 文件中的结构使用对象来表示。

在 XML 中,一切皆节点(Wode)。

  • Node:节点

  • Document:文档节点(XML 文件)

  • Element:元素节点(使用 <> 表示标签)

  • Attribute:属性节点(元素上属性名 = “属性值”)

  • Text:文本节点(元素之间的内容)

在这里插入图片描述

在这里插入图片描述

获取Document文档对象


DOM(Document Object Model):文档对象模型

  • 使用面问对象的方式,把 XML 文件中的结构使用对象来表示。

使用 Java 代码操作 XML

使用 JavaScript 操作 HTML

特点

  • 在加载的时候,一次性把整个XML文档加载进内存,在内存中形成一颗树对象(Document )。

  • 我们以后使用代码操作 Document,其实操作的是内存中的 DOM 树;和本地磁盘中的XML文件没有直接关系。

  • 比如:我保存了一个联系人,仅仅是内存中多了一个联系人,但是在XML文件中没有新增的痕迹。除非做 同步操作:把内存中的数据更新到XML文件。( 增删改操作完之后,都需要做同步操作。)

  • 缺点:若XML文件过大,可能造成内存溢出

获取 Document 文档对象

package com.yusael._03_dom;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import org.junit.Test;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

// DOM操作测试类

public class DOMTest {

private File f = new File(“F:/java/JavasePro/JUnit-XML-DOM-DOM4J/contacts.xml”);

// 如何获取Document文档对象

@Test

public void testGetDocument() throws Exception {

// 1):创建DocumentBuilderFactory对象(意识:工厂类中一般都有一个静态方法用于返回当前工厂类对象)

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

// 2):根据工厂对象, 创建DocumentBuilder对象

DocumentBuilder builder = factory.newDocumentBuilder();

// 3):根据builder对象去解析一个已经存在的XML文件, 从而得到Document对象.

Document doc = builder.parse(f); // [#document: null]

}

}

在这里插入图片描述

根据 DocumentBuilder 创建 Document 对象,有两种方式:

  • 当XML文档不存在时,使用 newDocument(),在内存中先创建出一颗 树对象(Document)。

Document doc=builder.newDocument();

  • 当XML文档存在时,我们只需要直接解析即可。

Document doc = builder.parse(File对象);

什么是解析(parse):一般而言,把使用 String 描述的事物,转换为描述该事物的类型。

// 解析时间

Date d = DateFormat对象.parse(“2018-10-10”);

得到某个具体的文本节点的内容:取出第二个联系人的名字


操作步骤:

  1. 获取 Document 文档对象

  2. 获取 XML 中的根元素 contacts

  3. 获取第二个联系人元素 linkman

  4. 获取 linkman 元素下的 name 子元素

  5. 获取 name 元素的文本内容

// 需求1、得到某个具体的文本节点的内容:取出第二个联系人的名字.

@Test

public void test1() throws Exception {

// 1):获取Document文档对象.

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);

// 2):获取XML中的根元素(contacts).

Element root = doc.getDocumentElement();

// 3):获取第二个联系人元素(linkman).

Element linkmanEl = (Element)root.getElementsByTagName(“linkman”).item(1);

// 4):获取linkman元素下的name子元素.

Element nameEl = (Element)root.getElementsByTagName(“name”).item(0);

// 5):获取name元素的文本内容.

System.out.println(nameEl.getTextContent());

}

修改某个元素节点的主体内容:把第一个联系人的邮箱改掉


操作步骤:

  1. 获取 Document 文档对象

  2. 获取 XML 中的根元素 contacts

  3. 获取第一个联系人元素 linkman

  4. 获取 linkman 元素下的 email 子元素

  5. 设置 email 元素的新的文本内容 will@

  6. 同步操作:把内存中的数据同步更新到磁盘的XML中

核心类:Transformer

// 需求2、修改某个元素节点的主体内容:把第一个联系人的邮箱改掉.

@Test

public void test2() throws Exception {

// 1):获取Document文档对象.

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);

// 2):获取XML中的根元素(contacts).

Element root = doc.getDocumentElement();

// 3):获取第一个联系人元素(linkman).

Element linkmanEl = (Element)root.getElementsByTagName(“linkman”).item(0);

// 4):获取linkman元素下的email子元素.

Element emailEle = (Element)linkmanEl.getElementsByTagName(“email”).item(0);

// 5):设置email元素的新的文本内容(will@).

emailEle.setTextContent(“will@”);

// 6):同步操作:把内存中的数据同步更新到磁盘的XML中.核心类:Transformer.

TransformerFactory factory = TransformerFactory.newInstance();

Transformer trans = factory.newTransformer();

Source xmlSource = new DOMSource(doc); // 源: 内存中的Document对象

Result outputTarget = new StreamResult(f); // 目标: 磁盘中的XML文件(contacts.xml)

trans.transform(xmlSource, outputTarget); // 同步操作

}

在这里插入图片描述

向指定元素节点中增加子元素节点:增加一个新的联系人信息


操作步骤:

  1. 获取 Document 文档对象

  2. 获取XML中的根元素 contacts

  3. 创建一个 linkman 元素的片段

  4. 创建 linkmannameemailaddressgroup 元素

  5. nameemailaddressgroup 元素设置文本内容

  6. nameemailaddressgroup 元素作为 linkman 元素的子元素

  7. linkman 元素作为根元素的子元素

  8. 同步操作:把内存中的数据同步更新到磁盘的XML中

核心类:Transformer.

// 需求3,向指定元素节点中增加子元素节点:增加一个新的联系人信息.

@Test

public void test3() throws Exception {

// 1):获取Document文档对象.

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);

// 2):获取XML中的根元素(contacts).

Element root = doc.getDocumentElement();

// -----------------------------------------------------

// 3):创建一个linkman元素的片段.

// 3.1):创建linkman,name,email,address,group元素

Element linkmanEl = doc.createElement(“linkman”);

Element nameEl = doc.createElement(“name”);

Element emailEl = doc.createElement(“email”);

Element addressEl = doc.createElement(“address”);

Element groupEl = doc.createElement(“group”);

// 3.2):给name,email,address,group元素设置文本内容

linkmanEl.setAttribute(“id”, “3”); // linkman设置id属性

nameEl.setTextContent(“yusael”);

emailEl.setTextContent(“yusael@qq.com”);

addressEl.setTextContent(“苏州”);

groupEl.setTextContent(“HELLO”);

// 3.3):把name,email,address,group元素作为linkman元素的子元素.

linkmanEl.appendChild(nameEl);

linkmanEl.appendChild(emailEl);

linkmanEl.appendChild(addressEl);

linkmanEl.appendChild(groupEl);

// 3.4):把linkman元素作为根元素的子元素

root.appendChild(linkmanEl);

// -----------------------------------------------------

// 4):同步操作:把内存中的数据同步更新到磁盘的XML中.核心类:Transformer.

TransformerFactory factory = TransformerFactory.newInstance();

Transformer trans = factory.newTransformer();

trans.transform(new DOMSource(doc), new StreamResult(f));

}

操作XML元素属性:设置/获取第三个联系人的id属性


操作步骤:

  1. 获取 Document 文档对象

  2. 获取XML中的根元素 contacts

  3. 获取第三个联系人元素 linkman

  4. 获取 linkman 元素下的 id 属性值 / 设置 linkman 元素的 id 属性值.

  5. 同步操作:把内存中的数据同步更新到磁盘的XML中

核心类:Transformer

如果是获取属性,是不需要同步操作的;如果是设置属性需要同步操作。

总结

以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!

下面给大家分享下我的面试大全资料

  • 第一份是我的后端JAVA面试大全

image.png

后端JAVA面试大全

  • 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理

字节二面拜倒在“数据库”脚下,闭关修炼半个月,我还有机会吗?

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理

  • 第三份是Spring全家桶资料

字节二面拜倒在“数据库”脚下,闭关修炼半个月,我还有机会吗?

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
m(new DOMSource(doc), new StreamResult(f));

}

操作XML元素属性:设置/获取第三个联系人的id属性


操作步骤:

  1. 获取 Document 文档对象

  2. 获取XML中的根元素 contacts

  3. 获取第三个联系人元素 linkman

  4. 获取 linkman 元素下的 id 属性值 / 设置 linkman 元素的 id 属性值.

  5. 同步操作:把内存中的数据同步更新到磁盘的XML中

核心类:Transformer

如果是获取属性,是不需要同步操作的;如果是设置属性需要同步操作。

总结

以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!

下面给大家分享下我的面试大全资料

  • 第一份是我的后端JAVA面试大全

[外链图片转存中…(img-OMb1dbzL-1714778715618)]

后端JAVA面试大全

  • 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理

[外链图片转存中…(img-Zl9PuqPj-1714778715619)]

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理

  • 第三份是Spring全家桶资料

[外链图片转存中…(img-KUN4ohD8-1714778715619)]

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值