将模拟注入Spring测试Mockito + Spring + TestNG

时间:2017-03-29 09:50:26

标签: java spring unit-testing mockito testng

我想为打印服务编写一个测试。我正在使用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注释可以解决我的问题,但事实并非如此。也许我对某些方面有所了解,或者我对测试服务的想法是完全错误的。

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();
  }

}

PrintingServiceTest

@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() {
    ...
  }

}

1 个答案:

答案 0 :(得分:0)

您可以使用@MockBean注释创建模拟spring bean。虽然我无法看到使用Spring测试的是什么,你应该让你的构造函数打开以保持单元测试简单,即构造函数DI,因此它不直接绑定到弹簧以注入模拟或其他实现。

对于更详细/更大的测试@MockBean是有用的。