JUnit5测试出现空指针java.lang.NullPointerException

版权声明:转载请标注来源: https://blog.csdn.net/qq_37844454/article/details/84675113

刚刚在做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以后所对应的注解,程序就没有问题了。

猜你喜欢

转载自blog.csdn.net/qq_37844454/article/details/84675113
今日推荐