Spring单元测试类ApplicationTests错误

本文介绍了在SpringBoot中进行单元测试时遇到的ApplicationTests类错误,分别展示了正确和异常的写法,帮助读者理解和解决此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1)正确写法

package com.boot.demo02restful;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.boot.restful.Application;
import com.boot.restful.service.UserService;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=Application.class)
public class ApplicationTests {
	
	@Autowired
	@Qualifier(value="myUserService")
	private UserService userSerivce;
	
	@Before
	public void setUp() {
		// 准备,清空user表
		userSerivce.deleteAllUsers();
	}
	
	@Test
	public void test() throws Exception {
		// 插入5个用户
		userSerivce.create("a", 1);
		userSerivce.create("b", 2);
		userSerivce.create("c", 3);
		userSerivce.create("d", 4);
		userSerivce.create("e", 5);
		// 查数据库,应该有5个用户
		Assert.assertEquals(5, userSerivce.getAllUsers().intValue());
		// 删除两个用户
		userSerivce.deleteByName("a");
		userSerivce.deleteByName("e");
		// 查数据库,应该有5个用户
		Assert.assertEquals(3, userSerivce.getAllUsers().intValue());
	}
	
}


2)异常写法

package com.boot.demo02restful;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.boot.restful.Application;
import com.boot.restful.service.UserService;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class ApplicationTests {
	
	@Autowired
	@Qualifier(value="myUserService")
	private UserService userSerivce;
	
	@Before
	public void setUp() {
		// 准备,清空user表
		userSerivce.deleteAllUsers();
	}
	
	@Test
	public void test() throws Exception {
		// 插入5个用户
		userSerivce.create("a", 1);
		userSerivce.create("b", 2);
		userSerivce.create("c", 3);
		userSerivce.create("d", 4);
		userSerivce.create("e", 5);
		// 查数据库,应该有5个用户
		Assert.assertEquals(5, userSerivce.getAllUsers().intValue());
		// 删除两个用户
		userSerivce.deleteByName("a");
		userSerivce.deleteByName("e");
		// 查数据库,应该有5个用户
		Assert.assertEquals(3, userSerivce.getAllUsers().intValue());
	}
	
}





### 问题分析 在 Spring Boot 单元测试中出现 `java.lang.IllegalStateException: Failed to load ApplicationContext` 的错误,通常表明测试环境无法正确加载 Spring 应用上下文。这种问题可能由多种原因引起,包括配置错误、依赖冲突或测试类未正确指定应用上下文。 以下是一些常见的解决方案和改进建议[^1]。 --- ### 解决方案 #### 1. 指定明确的应用上下文 如果测试类没有明确指定应用上下文的入口类(如 `@SpringBootApplication` 注解的主类),可能会导致上下文加载失败。可以通过以下方式解决: ```java @SpringBootTest(classes = AdminApplication.class) @RunWith(SpringRunner.class) public class SpringBoot1ApplicationTests { @Autowired private Person person; @Test public void contextLoads() { System.out.println(person); } } ``` 这里通过 `@SpringBootTest(classes = AdminApplication.class)` 明确指定了应用上下文的入口类[^2]。 --- #### 2. 配置 Web 环境 根据测试需求,可以选择不同的 `WebEnvironment` 类型。如果测试需要启动嵌入式容器(例如测试控制器或 WebSocket),可以设置为 `RANDOM_PORT`: ```java @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @RunWith(SpringRunner.class) public class SpringBoot1ApplicationTests { @Autowired private Person person; @Test public void contextLoads() { System.out.println(person); } } ``` 当设置为 `RANDOM_PORT` 时,Spring Boot 会启动一个嵌入式的 Servlet 容器,并在随机端口上监听请求[^4]。 如果测试不需要启动实际的 Web 环境(例如仅测试服务层逻辑),可以使用 `MOCK`: ```java @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) @RunWith(SpringRunner.class) public class SpringBoot1ApplicationTests { @Autowired private Person person; @Test public void contextLoads() { System.out.println(person); } } ``` --- #### 3. 检查依赖冲突 某些情况下,依赖冲突可能导致上下文加载失败。例如,Druid 数据库连接池的过滤器可能会抛出 `NullPointerException`[^3]。可以通过以下方式排查: - 使用 Maven 或 Gradle 检查依赖树,确保没有版本冲突。 - 如果使用了 Druid 连接池,检查其版本是否与 Spring Boot 兼容,并确保正确配置了过滤器。 --- #### 4. 确保配置文件正确加载 如果测试需要加载特定的配置文件(如 `application-test.yml`),可以通过 `@ActiveProfiles` 指定活动的配置文件: ```java @SpringBootTest @ActiveProfiles("test") @RunWith(SpringRunner.class) public class SpringBoot1ApplicationTests { @Autowired private Person person; @Test public void contextLoads() { System.out.println(person); } } ``` --- #### 5. 捕获详细的错误日志 如果上述方法仍未解决问题,可以通过启用调试日志捕获更详细的错误信息: ```properties logging.level.org.springframework=DEBUG ``` 将此配置添加到 `application.properties` 或 `application.yml` 文件中,以便更好地定位问题。 --- ### 示例代码 以下是综合以上解决方案的一个完整示例: ```java @SpringBootTest(classes = AdminApplication.class, webEnvironment = SpringBootTest.WebEnvironment.MOCK) @ActiveProfiles("test") @RunWith(SpringRunner.class) public class SpringBoot1ApplicationTests { @Autowired private Person person; @Test public void contextLoads() { assertNotNull(person); System.out.println(person); } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值