有人可以解释为什么 assertTrue 在这种情况下不会失败吗?
Can someone explain why assertTrue does not fail in this case?
所以我有一个这样的测试设置:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import com.sam.demo.HibernateUtil;
import com.sam.entity.Student;
public class HibernateTest {
private static SessionFactory sessionFactory;
private Session session;
@BeforeAll
public static void setup() {
sessionFactory = HibernateUtil.getSessionFactory();
}
@AfterAll
public static void teardown() {
sessionFactory.close();
}
@BeforeEach
public void openSession() {
session = sessionFactory.getCurrentSession();
}
@AfterEach
public void closeSession() {
session.close();
}
@Test
@DisplayName("Create student in the database")
public void testCreate() {
try {
Student student = new Student("Angela", "Wu", "angelawu@ntu.edu");
session.beginTransaction();
Integer id = (Integer) session.save(student);
session.getTransaction().commit();
Assertions.assertTrue(id > 0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
我在 运行 手动删除 table 之后进行了此测试,以查看我会得到什么结果。该记录无法插入数据库,因为 table 不存在,我得到了一个异常,但我很惊讶地看到我的测试通过了!有人可以帮我弄这个吗?我认为 save() 方法不会 return 任何东西并且 id 不会 > 0.
我的休眠配置是:
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/student_tracker?useSSL=false&serverTimezone=UTC
</property>
<property name="connection.username">root</property>
<property name="connection.password">password</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="current_session_context_class">thread</property>
<mapping class="com.sam.entity.Student" />
</session-factory>
</hibernate-configuration>
您从未达到 Assertions.assertTrue(id > 0);
声明。
由于数据库 table 丢失,commit
抛出异常。
您通过将堆栈跟踪打印到控制台来处理异常。
要让测试失败,您可以:
- 重新抛出异常
- 放弃异常处理
您的处理程序仅打印堆栈跟踪,但测试运行程序对未捕获的异常执行相同的操作,因此我会选择后一个选项。
附带说明一下,如果您需要处理异常,请尽量具体 - 捕获 Exception
很少是个好主意,因为它可以隐藏意外的异常。
所以我有一个这样的测试设置:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import com.sam.demo.HibernateUtil;
import com.sam.entity.Student;
public class HibernateTest {
private static SessionFactory sessionFactory;
private Session session;
@BeforeAll
public static void setup() {
sessionFactory = HibernateUtil.getSessionFactory();
}
@AfterAll
public static void teardown() {
sessionFactory.close();
}
@BeforeEach
public void openSession() {
session = sessionFactory.getCurrentSession();
}
@AfterEach
public void closeSession() {
session.close();
}
@Test
@DisplayName("Create student in the database")
public void testCreate() {
try {
Student student = new Student("Angela", "Wu", "angelawu@ntu.edu");
session.beginTransaction();
Integer id = (Integer) session.save(student);
session.getTransaction().commit();
Assertions.assertTrue(id > 0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
我在 运行 手动删除 table 之后进行了此测试,以查看我会得到什么结果。该记录无法插入数据库,因为 table 不存在,我得到了一个异常,但我很惊讶地看到我的测试通过了!有人可以帮我弄这个吗?我认为 save() 方法不会 return 任何东西并且 id 不会 > 0.
我的休眠配置是:
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/student_tracker?useSSL=false&serverTimezone=UTC
</property>
<property name="connection.username">root</property>
<property name="connection.password">password</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="current_session_context_class">thread</property>
<mapping class="com.sam.entity.Student" />
</session-factory>
</hibernate-configuration>
您从未达到 Assertions.assertTrue(id > 0);
声明。
由于数据库 table 丢失,commit
抛出异常。
您通过将堆栈跟踪打印到控制台来处理异常。
要让测试失败,您可以:
- 重新抛出异常
- 放弃异常处理
您的处理程序仅打印堆栈跟踪,但测试运行程序对未捕获的异常执行相同的操作,因此我会选择后一个选项。
附带说明一下,如果您需要处理异常,请尽量具体 - 捕获 Exception
很少是个好主意,因为它可以隐藏意外的异常。