当前位置: 首页 > 知识库问答 >
问题:

使用autowire的Spring boot现场注入在JUnit测试中不起作用

谭嘉歆
2023-03-14

我想在测试中注入DeMorgenArticleScraper。

@RunWith(SpringJUnit4ClassRunner.class)
public class DeMorgenArticleScraperTest {

    @Autowired
    private DeMorgenArticleScraper deMorgenArticleScraper;

    ...
}

DeMorgenArticleScraper组件本身进行了一些配置,但IDE/编译器并没有抱怨它们。

@Component
public class DeMorgenArticleScraper extends NewsPaperArticleScraper {

    @Autowired
    public DeMorgenArticleScraper(
            @Qualifier("deMorgenSelectorContainer") SelectorContainer selector,
            GenericArticleScraper genericArticleScraper,
            @Qualifier("deMorgenCompany") Company company) {
        super(selector, genericArticleScraper, company);
    }

    ...
}

用@Qualifier注释的构造函数参数在Config.class中使用@Bean定义。类本身有@Configuration。我想问题不在这里。

IDE已经警告我,找不到bean。。。必须在bean中定义自动连线成员。但据我所知,它是在带有@组件注释的bean中定义的。当Spring Boot应用程序可以启动时(当我注释掉测试类时),所有其他bean连接似乎都正常。

共有3个答案

程招
2023-03-14

我遇到了类似的问题,我的spring上下文没有得到初始化,因此我无法向bean注入Autowired注释。然后我看到了这篇文章,并按照@progonkpa的建议尝试了下面的注释,它开始工作了。

@SpringBootTest
@RunWith(SpringRunner.class)

但是后来我意识到@SpringBootTest已经包含了@ExtenTo({SpringExtension.class})注释,它是Junit5等效的@RunTo(SpringRunner.class),因此它应该在运行测试时加载Spring上下文。然后我发现了一个愚蠢的错误,我从Junit4导入了@Test注释(即org.junit.Test;)而不是Junit5(即org.junit.jupiter.api.Test;)库。我从Junit5库更改了@Test,它开始使用单个注释@SpringBootTest

p、 s:如果您使用的是junit5,请不要忘记从依赖项中排除junit4库

邹俊豪
2023-03-14

@SpringBootTest是相当重量级的,并且出于所有意图和目的都将加载您的整个应用程序,https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications,它相当重量级并且极大地影响了测试时间。根据您尝试测试的内容,您可能需要研究

  • 切片测试,例如JsonTest、DataJpaTest、WebMvcTest等,https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html#boot-功能测试spring boot应用程序测试自动配置测试。这些测试的好处不仅在于它们不会加载所有内容,因此速度更快,而且会尝试找出相关的配置
蔺劲
2023-03-14

我替换了

@RunWith(SpringJUnit4ClassRunner.class)

具有

@SpringBootTest
@RunWith(SpringRunner.class)

这似乎工作正常:我看到Spring Boot启动并加载bean。我将暂时保留这个问题以获得更好的建议。

 类似资料:
  • 并添加注释 我得到一条消息:没有测试找到test runner JUnit5,并且在Problems选项卡中有SpringBootTest.jar无法读取或者不是有效的ZIP文件 也试过 我也试过: 如果我将字符串myUrl硬编码为“http://localhost:8090”,则测试工作正常,因此问题在于@value不工作

  • 我想使用自定义的<code>TestExecutionListener</code>和<code>SpringJUnit4ClassRunner</code>结合使用,在我的测试数据库上运行Liquibase模式设置。我的<code>TestExecutionListener</code>工作正常,但当我在类上使用注释时,测试中DAO的注入不再工作,至少实例为空。 侦听器相当简单: 日志中没有错误

  • 我正在springboot应用程序中编写Junits,它只有一个初始化器类 以及其他控制器和服务类。 服务类的Junit如下所示: 当我运行Junit时,它会抛出如下错误: 我还尝试了所有注释,如,@ContextConfiguration(classes=Initializer.class),,但它仍会抛出相同的错误。代码中没有其他类似于应用程序上下文的配置类。

  • 我卡住了!如果跳过测试并部署到tomcat自动布线,则配置属性文件将正常工作。在我的测试中,它失败了!我不确定我错过了什么。 GitService-自带属性在Tomcat上工作! GitServiceTest由于NPE,该类在初始化时失败.属性为空。 粘贴后我确实意识到@EnableConfigurationProperties在application.java和GitService.java类上

  • 问题内容: 我使用SpringBeanAutowiringSupport在某些对象中进行bean注入。问题是,在jUnit测试中无法注入bean。为了进行测试,使用了SpringJUnit4ClassRunner。 有谁知道,为什么使用注入在jUnit测试中不起作用? 问题答案: 感谢M. Denium的帮助,他的解决方案得以奏效。

  • 我正在尝试使用Mockito在SprinBoot应用程序中进行一些jUnit测试。 现在我的服务有了一些变量,可以从通过注释: 我试图通过像这样使用来测试这个: 但是,该属性不会被填充,并保持为。 这方面有很多TPOIC,但我还没能拼凑出一个解决方案。我看到解决方案建议,但它似乎想做一个集成测试,使服务加速,但由于无法连接到数据库,服务失败了。所以这不是我想要的。 我还看到一些解决方案建议我制作一