刚刚在做Hibernate的时候,用到JUnit5做测试,遇到一个问题:
java.lang.NullPointerException
at cn.cloudspace.hibernate.entities.HibernateTest.testSessionCache(HibernateTest.java:65)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:436)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:170)
at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:166)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:113)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:58)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:112)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$2(HierarchicalTestExecutor.java:120)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
抛出来的异常显示在我的程序的65行找不到资源,所以显示空指针,并且控制台仅仅输出一个“this is testSessionCach()”,其他两个注解里面没有输出:
我的程序大概如下:
public class HibernateTest {
// 在生产环境里面这几个不能这样写为成员变量,因为可能涉及到并发问题
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
// 初始化Hibernate的方法(在程序执行前自动开启transition等)
@BeforeEach
public void init() {
System.out.println("this is init()");
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
.buildServiceRegistry();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
}
// 程序执行之后执行(transition关闭、session销毁等等)
@After
public void destroy() {
System.out.println("this is destroy()");
transaction.commit();
session.close();
sessionFactory.close();
}
@Test
public void testSessionCache() {
System.out.println("this is testSessionCach()");
News news = (News)session.get(News.class, 1);
System.out.println(news);
News news2 = (News)session.get(News.class, 1);
System.out.println(news2);
}
}
因为另外两个注解方法体里面的内容没有输出,所以,我就把解决问题的目光放在了另外两个注解里面。打上断点以后在测试发现果然这两个方法死活都进不去。于是跑到JUnit5的官网去看了看。发现了一个问题:
也就是说,在JUnit5以后,之前的注解:@After、@Before都不存在了,取而代之的分别是:@AfterEach、@BeforeEach
于是,我分别把注解改为JUnit5以后所对应的注解,程序就没有问题了。