我们正在将Apache CXF资源迁移到Spring MVC。碰巧我们将资源迁移到服务并为所有服务器配备一个大控制器更好。这就是我们以前所拥有的:
@Component
public class MainResource {
...
@Path("/first")
public FirstResource getFirstResource() {
...
@Path("/second")
public SecondResource getSecondResource() {
@Component
public class FirstResource {
@GET
@Path("/")
public FirstEntity getFirstEntity() {
@Component
public class SecondResource {
@GET
@Path("/")
public SecondEntity getSecondEntity() {
这就是我们现在所拥有的:
@Controller
public class MainController {
@Resource
FirstService firstService;
@Resource
SecondService secondService;
...
@GetMapping(/first)
public FirstEntity getFirst() {
...
@GetMapping(/second)
public SecondEntity getSecond() {
但是,当测试控制器时出现以下问题:我们希望按服务拆分测试,因此在每次测试中我们都必须为每个服务使用@MockBean
(否则无法启动应用程序上下文)。所以这是问题所在:
@RunWith(SpringRunner.class)
@WebMvcTest(MainController.class)
public class FirstWebMvcTest {
@MockBean
FirstService firstService;
@MockBean
SecondService secondService;
// testing /first call only. secondService is not used
@RunWith(SpringRunner.class)
@WebMvcTest(MainController.class)
public class SecondWebMvcTest {
@MockBean
FirstService firstService;
@MockBean
SecondService secondService;
// testing /second call only. firstService is not used
我们不想复制@MockBean
。作为一个临时解决方案,我已将它们全部移动到基类。但我不喜欢扩展基础测试类来获得这个@MockBean
定义,在我看来,这似乎是一个肮脏的解决方案。理想情况下,我想将其移至某种配置或其他内容。
感谢您的任何建议!
答案 0 :(得分:1)
您可以在测试src中创建一个@Configuration
类。
@Configuration
@MockBean(FirstService.class)
public class foo{
}
等
并在需要时导入它,或者如果组件扫描向其添加@Profile
,那么当某个配置文件处于活动状态以进行测试和使用模拟bean时,它将处于活动状态。