Java 将模拟注入到Spring test Mockito+;弹簧&x2B;TestNG
我想为打印服务编写一个测试。我将Spring与TestNG和Mockito一起使用 到目前为止,我已经为我的spring上下文和所需的测试类创建了一个测试配置类 我想测试的PrintingService类依赖于几个服务,所以我决定模拟它们。我的问题是我不能让它与Spring一起工作。每次我开始测试时,spring都会抛出一个异常Java 将模拟注入到Spring test Mockito+;弹簧&x2B;TestNG,java,spring,unit-testing,mockito,testng,Java,Spring,Unit Testing,Mockito,Testng,我想为打印服务编写一个测试。我将Spring与TestNG和Mockito一起使用 到目前为止,我已经为我的spring上下文和所需的测试类创建了一个测试配置类 我想测试的PrintingService类依赖于几个服务,所以我决定模拟它们。我的问题是我不能让它与Spring一起工作。每次我开始测试时,spring都会抛出一个异常 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No quali
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
注释可以解决我的问题,但事实并非如此。也许我对某些方面理解错误,或者我测试服务的想法完全错误
PrintingTestConfig
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() {
...
}
}
打印服务测试
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
注释创建mockspringbean。虽然我看不到Spring测试的内容,但您应该打开构造函数以保持单元测试的简单性,即构造函数DI,这样它就不会直接绑定到Spring来注入模拟或其他实现
在更详细/大型测试的情况下,
@MockBean
非常有用 您可以使用@MockBean
注释创建模拟Springbean。虽然我看不到Spring测试的内容,但您应该打开构造函数以保持单元测试的简单性,即构造函数DI,这样它就不会直接绑定到Spring来注入模拟或其他实现
在更详细/大型测试的情况下,@MockBean
非常有用