Java Can';SpringBoot多模块应用程序JUnit4测试中的Autowire服务

Java Can';SpringBoot多模块应用程序JUnit4测试中的Autowire服务,java,spring,spring-boot,junit,Java,Spring,Spring Boot,Junit,我有以下项目结构: -模块1 --src/main/java/at.flobau.demo.module1 ---模型 ----Product.java ---服务 ----ProductService.java ---TestConfiguration.java --src/test/java/at.flobau.demo.module1.service ---ProductServiceTest.java -模块2 --src/main/java/at.flobau.demo.main -

我有以下项目结构:

-模块1
--src/main/java/at.flobau.demo.module1
---模型
----Product.java
---服务
----ProductService.java
---TestConfiguration.java
--src/test/java/at.flobau.demo.module1.service
---ProductServiceTest.java
-模块2
--src/main/java/at.flobau.demo.main

---java
您是否尝试过在测试配置类中创建服务的bean

@TestConfiguration
@ComponentScan("at.flobau.demo")
public class TestConfiguration { 
    @Bean
    public ProductService productService() {
        return new ProductService();
    }
}

您可以使用
@SpringBootTest(classes=ProductService.class)

注释您的测试类。您应该避免使用字段注入(即使是可能的),而使用构造函数注入。这将解决这个问题,因为您将能够从构造函数传递服务,但它在将来也会很有用,因为您可以用代码的方式找到用法和跟踪对象,而不是“隐藏”的字段注入

因此,我建议不要试图在这里解决您的问题,而是在构造函数注入中重构您的类,然后通过在测试中直接创建对象或为测试创建配置来传递服务,该配置将生成对象并给出它所需的参数

差不多

@ContextConfiguration(classes={GeneralTester.TestConfig.class})
@RunWith(SpringRunner.class)
公共类GeneralTester{
@测试配置
公共静态类TestConfig{
@豆子
公共IPProductService productService(最终IPProductRepository productRepository){
返回新的ProductService(productRepository);
}
@豆子
公共IPProductRepository productRepository(){
返回mock(IProductRepository.class);
}
}
@自动连线
公共产品服务;
@自动连线
公共知识产权知识库;
@以前
公共作废设置(){
重置(产品存储库);
}
@之后
公共无效拆卸(){
验证NomoreInteractions(productRepository);
}
@试验
公共无效doSmth(){
//…您的设置
当(productRepository.save(any())。然后返回(“某物”);
//…你的呼吁和主张
验证(productRepository).保存(any());
}
}

我得到了一个带有junit测试用例过程的示例应用程序,使用mockito尝试显式地将ProductService的包名添加到配置类中的@ComponentScan(“at.flobau.demo”)Main类在module2中,因此module1不是spring boot应用程序,请尝试将@SpringBootConfiguration添加到测试配置中。[参考此答案。当您创建配置时进行测试时,您应该使用
@TestConfiguration
注释。只是一个建议我当时得到了:原因:
org.springframework.beans.factory.NoSuchBeanDefinitionException:没有“de.esag.tyr.poc.products.service.IProductRepository”类型的合格bean可用:预计在至少1个符合autowire候选项资格的bean。依赖项批注:{@org.springframework.beans.factory.annotation.Autowired(required=true)}
仔细阅读。它试图在其中创建IPProductRepository的bean。尝试用注释@MockBean模拟它。谢谢你的回答。但是我的ProductService没有参数,所以我不能这样实现它。是的,我看到它没有参数,但我的建议是重构它并使用带有p的构造函数参数而不是@BioaimAlso的现场注入,所以我刚刚意识到您正在进行单元测试,并且您有
@SpringBootTest
。这是不需要的,因为它只会使您的测试慢很多(而不是半秒,它将占用您的服务器启动所需的时间…)单元测试不应该要求服务器运行。因此,我的测试示例现在没有
@springbootest
ok理解这一点。我现在确实收到了这个错误:
在类路径资源[at/flobau/demo/products/service/ProductServiceTest$TestConfig.class]中定义了名为“productService”的无效bean定义:@Bean-definition被现有Bean-definition非法覆盖
我需要查看您的代码,因为这意味着您错过了一个小细节。也许可以尝试使用pastebin?