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

Spring中的单元测试:向被测组件中注入依赖项

白嘉石
2023-03-14

我有一个非常简单的rest控制器:

@RestController
public class MyController {
    @Autowired
    public Logger logger;

记录器依赖项通过以下配置注入:

@Configuration
public class MyConfig {
    @Bean
    public Logger logger() {
        return LoggerFactory.getLogger(MyController.class);
    }
@Configuration
@Profile("test")
public class MyTestConfig {
    @Bean
    public Logger logger() {
        return LoggerFactory.getLogger(MyCOntroller.class);
    }
@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration(classes = MyTestConfig.class)
@ActiveProfiles("test")
public class MyContollerTest {

共有1个答案

西门展
2023-03-14

单元测试不应该使用任何Spring配置。您应该简单地实例化组件,并手动注入依赖项(通常是假的)。

你用了场注入,这让它变得有点难。使用构造函数注入,您所需要做的就是

Logger logger = LoggerFactory.getLogger(MyController.class);
MyController controller = new MyController(logger);

不过,由于@mock@spy@injectmock注释,Mockito可以帮助您注入假的依赖项,即使在使用字段注入时也是如此:

@Spy
private Logger logger = LoggerFactory.getLogger(MyController.class);

@InjectMocks
private MyController controller;

@Before
public void prepare() {
    MockitoAnnotations.initMocks(this);
}

也就是说,如果我没有弄错的话,您没有使用@runwith(SpringJunit4ClassRunner.class),因此您的测试运行程序对Spring一无所知,因此没有创建或使用任何Spring配置。

 类似资料:
  • quote.component.ts 此组件依赖于来获取随机报价,然后它将显示。 类很简单 - 它只有getQuote函数,它将修改DOM,因此它将是我们测试的主要目标。 为了测试这个组件,我们需要启动QuoteComponent类。 Angular测试库提供了一个名为TestBed的实用程序。 这允许我们配置一个测试模块,我们可以提供模拟依赖。 此外,它将为我们创建组件并返回一个组件fixtur

  • 我正在使用垃圾,模拟和模拟MVC来测试网络应用程序的工作。我正在与一个我无法弄清楚的注入的依赖关系作斗争。我的网络应用程序结构如下。 和服务级别 我需要测试此控制器的搜索方法,但是service2当前不活动,因此必须模拟对它的调用。我可以模拟service2,但不知道如何在控制器的mockMVC实例中注入service2的模拟。据我所知,mockito中的@InjectMocks只注入一层深度的m

  • 我有以下用例: 问题2:为什么如果我只使用构造函数而不使用@Autowired或者反之亦然,那么一切都能正常工作,因为我没有加载Spring上下文...我有单元测试...

  • 问题内容: 我正在测试服务A,但是服务A取决于服务B(即服务B已注入服务A)。 我已经看到了这个问题,但是我的情况有所不同,因为我认为_模拟_ 服务B而不是注入服务B的实际实例更有意义。我将用茉莉间谍对其进行模拟。 这是一个示例测试: 我得到的错误是: 错误:未知提供程序:serviceBProvider 我该怎么做? 问题答案: 实际上,在AngularJS中,依赖注入使用“最后获胜”规则。因此

  • overrideComponent overrideDirective overridePipe import {MessageComponent} from './message.component'; import { provide } from '@angular/core'; import { async, inject, TestBed, } from '@angular/

  • 我使用的是一个用MapStruct生成的映射器: 缺省组件模型是spring(在pom.xml中设置)