gpt4 book ai didi

java - 将模拟注入(inject) Spring 测试 Mockito + Spring + TestNG

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:45 26 4
gpt4 key购买 nike

我想为打印服务编写测试。我将 Spring 与 TestNG 和 Mockito 一起使用。

到目前为止,我已经为我的 spring 上下文和所需的测试类创建了一个测试配置类。

我想要测试的 PrintingService 类依赖于多个服务,因此我决定模拟它们。我的问题是我无法让它与 Spring 一起工作。每次我开始测试时,spring都会抛出异常

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.printservice.server.message.MessageService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

我想使用@InjectMocks注释可以解决我的问题,但它没有。也许我误解了某些方面,或者我测试服务的想法完全错误。

打印测试配置

package com.example.printservice;

import com.example.printservice.server.print.PrintingService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;

@Configuration
@ComponentScan(basePackageClasses = {PrintingService.class}, scopedProxy = ScopedProxyMode.TARGET_CLASS)
public class PrintingTestConfig {

@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigIn() {
return new PropertySourcesPlaceholderConfigurer();
}

}

打印服务测试

@ContextConfiguration(classes = PrintingTestConfig.class, loader = AnnotationConfigContextLoader.class)
public class PrintingServiceTest extends AbstractTestNGSpringContextTests {

@Mock
private MessageService _messageService;

@Mock
private ClientCache_clientCache;

@Mock
private PrinterCache _printerCache;

@Value("classpath:example.pdf")
private Resource _examplePdf;

@InjectMocks
private PrintingService _printingService;

@BeforeMethod
public void setup() {
MockitoAnnotations.initMocks(this);
}

@Test
public void printPdf() {
...
}

}

最佳答案

您可以使用@MockBean注释创建模拟Spring bean。虽然我看不到 Spring 测试的内容,但您应该打开构造函数以保持单元测试简单,即构造函数 DI,这样它就不会直接与 spring 绑定(bind)来注入(inject)模拟或其他实现。

在更详细/大型测试的情况下,@MockBean 很有用。

关于java - 将模拟注入(inject) Spring 测试 Mockito + Spring + TestNG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43090064/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com