Spring Boot中JUnit测试报InvalidTestClassError错误如何解决?
问题解决方法
你遇到的InvalidTestClassError是因为JUnit 4要求测试类必须包含唯一的公共无参构造函数,而@RequiredArgsConstructor会生成带参数的构造函数,覆盖了默认的无参构造,导致JUnit 4无法实例化测试类。以下是几种可行的解决方案:
方案1:改用@Autowired注入依赖
去掉@RequiredArgsConstructor,直接用@Autowired注入Repository:
import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; @DataJpaTest public class CategoryRepositoryTests { @Autowired private CategoryRepository categoryRepository; @Test public void givenCategoryObject_whenSave_thenReturnSavedCategory() { // given - precondition or setup Category category = Category.builder().name(CategoryType.COMIC.getValue()).build(); // when - action or the behaviour that we are going test Category savedCategory = categoryRepository.save(category); // then assertThat(savedCategory.getId()).isGreaterThan(0); assertThat(savedCategory).isNotNull(); } }
方案2:保留构造注入,添加无参构造
通过Lombok的@NoArgsConstructor(force = true)生成公共无参构造(force = true用于初始化final字段为null,避免编译错误):
import lombok.RequiredArgsConstructor; import lombok.NoArgsConstructor; import org.junit.Test; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; @DataJpaTest @RequiredArgsConstructor @NoArgsConstructor(force = true) public class CategoryRepositoryTests { private final CategoryRepository categoryRepository; @Test public void givenCategoryObject_whenSave_thenReturnSavedCategory() { // 测试代码不变 } }
方案3:切换到JUnit 5(推荐)
JUnit 5(JUnit Jupiter)支持带参构造的测试类,无需依赖无参构造。你需要:
- 替换JUnit 4的
@Test注解为org.junit.jupiter.api.Test - 确保项目依赖中使用JUnit 5的相关依赖(Spring Boot 2.2+版本默认支持)
- 无需额外添加
@RunWith,因为@DataJpaTest在JUnit 5下自动集成SpringExtension
修改后的代码示例:
import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; @DataJpaTest @RequiredArgsConstructor public class CategoryRepositoryTests { private final CategoryRepository categoryRepository; @Test public void givenCategoryObject_whenSave_thenReturnSavedCategory() { // 测试代码不变 } }
内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu
相关产品推荐
相关产品推荐

