You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)支持带参构造的测试类,无需依赖无参构造。你需要:

  1. 替换JUnit 4的@Test注解为org.junit.jupiter.api.Test
  2. 确保项目依赖中使用JUnit 5的相关依赖(Spring Boot 2.2+版本默认支持)
  3. 无需额外添加@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:30:49