如何模拟使用Primary注释的类

时间:2018-04-04 10:46:27

标签: spring-boot mockito

我有:

  • 界面:EntityService
  • 第一个实现:EntityServiceImpl - 此类使用@Primary
  • 进行注释
  • 另一个:EntityServiceClientImpl
  • 以及具有此字段@Autowired EntityService
  • 的控制器

我想对这个控制器进行测试,并且这个测试是单一的我模拟EntityService

当然,这段代码不起作用,因为Spring检测到两个用Primary注释的bean:

@Configuration
class EntityControllerTestConfig {
    @Bean
    @Primary
    EntityService entityService() {
        return mock(EntityService.class);
    }
}

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class)
@WebAppConfiguration
@ContextConfiguration(classes = EntityControllerTestConfig.class)
public class EntityControllerTest {

    @Autowired
    private EntityService entityService;

...

@SpringBootApplication(scanBasePackages= "com.company.app")
@EntityScan (basePackages = {"com.company.app" }, basePackageClasses = {Jsr310JpaConverters.class })
@EnableJpaRepositories("com.company.app")
public class TestApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}

我试图找到另一种方法来模拟和排除EntityServiceClient测试配置,但我无法模拟。 (cf:exclude @Component from @ComponentScan

2 个答案:

答案 0 :(得分:1)

我最终找到了解决方案:弹簧上下文(带控制器,controllerAdvice和服务模拟)而不是弹簧启动上下文

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class EntityControllerTest {

    @Configuration
    public static class EntityControllerTestConfig {
        @Bean
        public EntityService entityService() {
            return mock(EntityService.class);
        }

        @Bean
        public EntityController entityController() {
            return new EntityController(entityService());
        }
    }

    @Autowired
    private EntityService entityService;

    @Autowired
    private EntityController entityController;

    private MockMvc mockMvc;

    @Before
    public void setup() throws DomaineException {
        this.mockMvc = MockMvcBuilders
            .standaloneSetup(entityController)
            .setControllerAdvice(new myControllerAdvice())
            .build();

注意:从Spring 4.2开始,您可以像这样设置ControllerAdvice。

答案 1 :(得分:0)

您可以略微区别对待它,并将@WebMvcTest@MockBean注释结合起来,仅使用它自己的最小上下文来测试控制器。

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = EntityController.class)
public class EntityControllerTest {

  @MockBean
  private EntityService entityService;

  @Autowired
  private MockMvc mvc;

在此示例中,EntityService将被模拟,而MockMvc可用于在控制器中声明请求映射。