我正在编写一个控制器外观为
的控制器测试@RestController
public class VehicleController {
@Autowired
private VehicleService vehicleService = null;
...
}
虽然测试类看起来像
@RunWith(SpringRunner.class)
@WebMvcTest(VehicleController.class)
public class VehicleControllerTest {
@Autowired
private MockMvc mockMvc = null;
@MockBean
private VehicleService vehicleServie = null;
@Test
public void test() {
...
}
}
运行此测试时,它失败并显示以下错误
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.database.repositories.SomeOtherRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
在此,SomeOtherRepository
未在给定的控制器或服务中使用。
如果我为@MockBean
做SomeOtherRepository
,则测试有效,但是其余存储库也出现相同的问题。
@MockBean private SomeOtherRepository someOtherRepository = null
...
# Bunch of other repositories
理想情况下,除了我正在使用的存储库之外,我不应该关心所有存储库。我在这里想念什么?如何避免编写@MockBean
堆?
答案 0 :(得分:0)
您已指定
@WebMvcTest(VehicleController.class)
这很好,但是您可能会从其他依赖项中找到一些bean,例如也引入了自定义UserDetailsService
,一些自定义验证或@ControllerAdvice
。
您可以使用exclude filters排除这些bean。
@WebMvcTest(controllers = VehicleController.class, excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = CustomUserDetailsService.class)