我有:
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)
答案 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
可用于在控制器中声明请求映射。