【Java 强化(1),Java高级工程师面试题
作者:互联网
@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 应该为 TRUEAssert.assertFalse(message, condition)
:断言 condition 应该为 FALSE -
Assert.assertNull(message, object)
:断言对象 object 为 nullAssert.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异常, 测试通过
}
}
```
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20200429192925423.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
[](https://blog.csdn.net/weixin_43734095/article/details/105845863)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做配置文件。
[](https://blog.csdn.net/weixin_43734095/article/details/105845863)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"?>
<contacts>
<linkman id="1">
<name>Will</name>
<email>iwiller@qq.com</email>
<address>成都</address>
<group>叩丁狼教育</group>
</linkman>
<linkman id="2">
<name>Stef</name>
<email>lanyotech@qq.com</email>
<address>成都</address>
<group>叩丁狼教育</group>
</linkman>
</contacts>
```
[](https://blog.csdn.net/weixin_43734095/article/details/105845863)DTD 约束(了解)
-----------------------------------------------------------------------------
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20200430002106810.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
[](https://blog.csdn.net/weixin_43734095/article/details/105845863)Scheme 约束(了解)
--------------------------------------------------------------------------------
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20200429205532710.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
[](https://blog.csdn.net/weixin_43734095/article/details/105845863)DOM
======================================================================
**DOM(Document Object Model)**:文档对象模型
* 使用面问对象的方式,把 XML 文件中的结构使用对象来表示。
在 XML 中,一切皆节点(Wode)。
* **Node**:节点
* **Document**:文档节点(XML 文件)
* **Element**:元素节点(使用 <> 表示标签)
* **Attribute**:属性节点(元素上属性名 = “属性值”)
* **Text**:文本节点(元素之间的内容)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20200429233849489.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20200429233912238.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
[](https://blog.csdn.net/weixin_43734095/article/details/105845863)获取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]
}
}
```
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20200429235333652.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
根据 `DocumentBuilder` 创建 `Document` 对象,有两种方式:
* 当XML文档不存在时,使用 `newDocument()`,在内存中先创建出一颗 树对象(Document)。
```
Document doc=builder.newDocument();
```
* 当XML文档存在时,我们只需要**直接解析**即可。
```
Document doc = builder.parse(File对象);
```
什么是**解析**(parse):一般而言,把使用 String 描述的事物,转换为描述该事物的类型。
```
// 解析时间
Date d = DateFormat对象.parse("2018-10-10");
```
[](https://blog.csdn.net/weixin_43734095/article/details/105845863)得到某个具体的文本节点的内容:取出第二个联系人的名字
---------------------------------------------------------------------------------------------
操作步骤:
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());
}
```
[](https://blog.csdn.net/weixin_43734095/article/details/105845863)修改某个元素节点的主体内容:把第一个联系人的邮箱改掉
---------------------------------------------------------------------------------------------
操作步骤:
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); // 同步操作
}
```
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20200430102612764.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
[](https://blog.csdn.net/weixin_43734095/article/details/105845863)向指定元素节点中增加子元素节点:增加一个新的联系人信息
----------------------------------------------------------------------------------------------
操作步骤:
1. 获取 `Document` 文档对象
2. 获取XML中的根元素 `contacts`
3. 创建一个 `linkman` 元素的片段
1. 创建 `linkman`、`name`、`email`、`address`、`group` 元素
2. 给 `name`、`email`、`address`、`group` 元素设置文本内容
3. 把 `name`、`email`、`address`、`group` 元素作为 `linkman` 元素的子元素
4. 把 `linkman` 元素作为根元素的子元素
4. **同步操作**:把内存中的数据同步更新到磁盘的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));
}
```
[](https://blog.csdn.net/weixin_43734095/article/details/105845863)操作XML元素属性:设置/获取第三个联系人的id属性
---------------------------------------------------------------------------------------------
操作步骤:
1. 获取 `Document` 文档对象
2. 获取XML中的根元素 `contacts`
3. 获取第三个联系人元素 `linkman`
4. 获取 `linkman` 元素下的 `id` 属性值 / 设置 `linkman` 元素的 `id` 属性值.
5. **同步操作**:把内存中的数据同步更新到磁盘的XML中
核心类:`Transformer`
如果是获取属性,是不需要同步操作的;如果是设置属性需要同步操作。
```
// 需求4、操作XML元素属性:设置/获取第三个联系人的id属性.
@Test
public void test4() 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(2);
// -----------------------------------------------------
// 4):获取linkman元素下的id属性/设置linkman元素的id属性值.
linkmanEl.setAttribute("id", "3"); // 设置第3个人的id为3
String id = linkmanEl.getAttribute("id"); // 获取第3个人的id
// -----------------------------------------------------
// 5):同步操作:把内存中的数据同步更新到磁盘的XML中.核心类:Transformer.
TransformerFactory factory = TransformerFactory.newInstance();
Transformer trans = factory.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(f));
}
```
[](https://blog.csdn.net/weixin_43734095/article/details/105845863)删除指定元素节点:删除第三个联系人信息.
---------------------------------------------------------------------------------------
操作步骤:
1. 获取 `Document` 文档对象
2. 获取XML中的根元素 `contacts`
3. 获取第三个联系人元素 `linkman`
4. 删除第三个 `linkan` 元素.(请自己的老爸来干掉自己)
5. 同步操作:把内存中的数据同步更新到磁盘的XML中
### 最后
### **[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**
![](https://www.icode9.com/i/ll/?i=img_convert/dff92c27d5214a04439cbb22a8d5f0fb.png)
![](https://www.icode9.com/i/ll/?i=img_convert/a521671fb568290bf9f2c15321deb45e.png)
![](https://www.icode9.com/i/ll/?i=img_convert/f8fa0a58022988d6b8c0b737346026b2.png)
![](https://www.icode9.com/i/ll/?i=img_convert/bd541a704de10721c8536bd8ecab17f4.png)
![](https://www.icode9.com/i/ll/?i=img_convert/8fa072a8aedd74929a8b1a5821e448a4.png)
![](https://www.icode9.com/i/ll/?i=img_convert/e22d9be786786fb56c2135ffa14769fe.png)
由于篇幅原因,就不多做展示了
核心类:Transformer.
TransformerFactory factory = TransformerFactory.newInstance();
Transformer trans = factory.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(f));
}
```
[](https://blog.csdn.net/weixin_43734095/article/details/105845863)删除指定元素节点:删除第三个联系人信息.
---------------------------------------------------------------------------------------
操作步骤:
1. 获取 `Document` 文档对象
2. 获取XML中的根元素 `contacts`
3. 获取第三个联系人元素 `linkman`
4. 删除第三个 `linkan` 元素.(请自己的老爸来干掉自己)
5. 同步操作:把内存中的数据同步更新到磁盘的XML中
### 最后
### **[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**
[外链图片转存中...(img-WBHwqEvM-1630849837270)]
[外链图片转存中...(img-0EJTRhnz-1630849837272)]
[外链图片转存中...(img-zsG2evEU-1630849837275)]
[外链图片转存中...(img-tlz91Bl7-1630849837277)]
[外链图片转存中...(img-gqoMCk6C-1630849837278)]
[外链图片转存中...(img-cyLWL4gX-1630849837279)]
由于篇幅原因,就不多做展示了
标签:XML,面试题,linkman,Java,img,工程师,元素,https,Document 来源: https://blog.csdn.net/m0_61452168/article/details/120122218