有人可以解释为什么 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&amp;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 很少是个好主意,因为它可以隐藏意外的异常。