Spring boot Autowired存储库在我的@SpringBootTest类中为空

Spring boot Autowired存储库在我的@SpringBootTest类中为空,spring-boot,junit,java-11,spring-test,Spring Boot,Junit,Java 11,Spring Test,我在试着测试我的GET终点。为此,我需要在内存H2数据库中加载一些数据。我有以下测试课程: @ExtendWith(SpringExtension.class) @SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT) public class UserApiControllerIntegrationTest { @Autowired private ExerciseRepository

我在试着测试我的GET终点。为此,我需要在内存H2数据库中加载一些数据。我有以下测试课程:

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserApiControllerIntegrationTest {

    @Autowired
    private ExerciseRepository myRepository;

    ...

    @Before
    public void initializeDatabase() {
        ...
    }
}
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT, 
                classes= TestConfig.class)
public class UserApiControllerIntegrationTest {

    @Autowired
    private ExerciseRepository myRepository;

    ...

    @Before
    public void initializeDatabase() {
        ...
    }
}
initializeDatabase()
方法中,我创建了几个对象,并使用repository方法
.saveAndFlush()
将它们保存在数据库中

当我尝试运行此测试类时,出现以下错误:

java.lang.NullPointerException:无法调用 “…MyRepository.saveAndFlush(对象)”因为“this.MyRepository”是 空的

我看到一些帖子有同样的错误,但没有正确的答案。我也试着把
@DataJpaTest
放进去,但什么也没发生。 我还尝试添加
@RunWith(SpringRunner.class)
注释,但出现了另一个错误:

java.lang.IllegalStateException:配置错误:找到多个 测试类的@BootstrapWith声明 [com.egym.creating.codingtask.api.RankingApiControllerIntegrationTest]: [@org.springframework.test.context.BootstrapWith(value=org.springframework.boot.test.context.SpringBootTestContextBootstrapper), @org.springframework.test.context.BootstrapWith(value=org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTestContextBootstrapper)]

更新

这是我的Application.java类:

@SpringBootApplication
@ComponentScan(basePackages = { "...", "....api",
        "....config" })
public class Application implements CommandLineRunner {

    public static void main(String[] args) {
        new SpringApplication(Application.class).run(args);
    }

    ...
}
在我的配置目录中,我有:

  • 一个OpenAPIDOcumentationConfig类,我在其中启用了Swagger 2
  • 用于重定向到OpenAPI文档的HomeController类

我认为这些对我的错误没有影响。

我们可以在测试类中创建一个myrepository bean实例来连接依赖关系


我们可以尝试使用mockito之类的库来模拟测试用例中的bean。

Spring anotation@SpringBootTest将只扫描在您的文件目录(以及子目录)下声明的bean。为了扫描其他bean,您需要提供带有@ComponentScan注释的目录,方法与在SpringBootApplication类中相同

添加测试配置文件:

@Configuration
@ComponentScan(basePackages = { "...", "....api",
    "....config" })
public class TestConfig {
}
将测试配置文件链接到测试类:

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserApiControllerIntegrationTest {

    @Autowired
    private ExerciseRepository myRepository;

    ...

    @Before
    public void initializeDatabase() {
        ...
    }
}
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT, 
                classes= TestConfig.class)
public class UserApiControllerIntegrationTest {

    @Autowired
    private ExerciseRepository myRepository;

    ...

    @Before
    public void initializeDatabase() {
        ...
    }
}

你能把你的主要春季课程。。。它的注释和配置也会影响spring测试设置。我会尽快更新。您能更具体一点或者提供一些代码/文档吗?嗨,krzysztof K,谢谢您的回答。我创建了一个新类
TestConfig
,该类等于您的(当然我替换了我隐藏的
..
。此外,我在
@springbootest
注释中添加了classes参数。但没有任何更改。不过,我确认我的测试类位于不包含bean的测试目录中。