1. 什么是 TearDown 方法?
-
定义:
TearDown
方法在测试框架(如 JUnit)中用于清理资源。它通常会在每个测试方法执行完成后自动运行,以确保测试环境的独立性。
作用:- 释放测试中分配的资源(如关闭数据库连接、删除临时文件等)。
- 防止测试间的干扰。
-
JUnit 示例:
@After public void tearDown() { // 清理操作,比如关闭数据库连接 if (connection != null) { connection.close(); } }
-
TestNG 示例:
@AfterMethod public void tearDown() { // 释放资源 driver.quit(); }
-
重点:
- JUnit 使用
@After
注解,TestNG 使用@AfterMethod
。 - 它通常配合
@Before
或@BeforeMethod
用于测试的前后资源管理。
- JUnit 使用
2. Hutool 工具包的 BeanUtil.copyProperties
使用说明
-
问题背景:
使用BeanUtil.copyProperties(item, ItemDoc.class)
时:item
中的id
是Long
类型。ItemDoc.class
的id
是String
类型。
是否可以成功复制?- 答案:可以!
Hutool 会尝试自动类型转换,如果类型兼容(如Long
->String
),会成功复制。
-
原理:
Hutool 使用了反射和类型转换机制:- 通过反射获取源对象和目标对象的字段。
- 如果字段名相同且类型可以兼容,直接赋值。
- 如果类型不同,会尝试进行类型转换(支持基本类型与其包装类、
String
与常见类型之间的转换)。
-
示例:
public class Item { private Long id; // getter and setter } public class ItemDoc { private String id; // getter and setter } Item item = new Item(); item.setId(12345L); ItemDoc itemDoc = new ItemDoc(); BeanUtil.copyProperties(item, itemDoc); System.out.println(itemDoc.getId()); // 输出 "12345"
-
注意:
- 如果字段类型差异过大(如
Date
->Integer
),可能会报错或跳过。 - 确保目标类有无参构造方法。
- 如果字段类型差异过大(如
3. 为什么测试类要放在与启动类同样结构的包下或其子包中?
- Spring Boot 的组件扫描机制:
- 默认情况下,
@ComponentScan
从启动类所在包开始扫描其子包。 - 如果测试类在与启动类无关的包中,Spring 可能无法找到其定义的组件或配置,导致上下文加载失败。
- 默认情况下,
- JUnit 的上下文加载依赖:
- 使用
@SpringBootTest
的测试类需要加载 Spring 上下文。 - 如果测试类不在启动类的扫描路径中,可能会导致测试失败,因为找不到需要的配置或组件。
- 使用
- 维护性与约定优于配置原则:
- 测试类与被测类保持一致的包结构,便于管理和维护。
- 遵循 Spring Boot 的默认约定,减少额外配置,提升开发效率。