WebMvcTest 与实际服务实现

问题描述 投票:0回答:2

如何在 Spring Boot 中创建“准”MVC 集成测试。我想使用我真正的服务实现,但我无法做到这一点。我如何注入真正的实现而不是模拟。 我的课程看起来像这样

@Controller
@RequiredArgsConstructor
public class DashboardController {

    private final RolesManagerService rolesManagerService;
    private final ServletRequestManagerService servletRequestManagerService;

    @GetMapping({"/", "/dashboard"})
    public String index(Model model, HttpServletRequest httpServletRequest) {
        model.addAttribute("canAddNewOrder", rolesManagerService.canRoleAccessApplicationPart(servletRequestManagerService.getRole(httpServletRequest), ApplicationPart.CREATE_NEW_ORDER));
        model.addAttribute("var", "test");
        return "dashboard";
    }
}

和测试

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = DashboardController.class)
@AutoConfigureMockMvc
class IndexControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private UserDetailsService userDetailsService;

    @MockBean
    RolesManagerService rolesManagerService;
    @MockBean
    private ServletRequestManagerService servletRequestManagerService;

    @Test
    void testDashboard() throws Exception {
        mockMvc.perform(get("/dashboard").with(user("admin").password("pass").roles("USER","ADMIN")))
                .andExpect(status().isOk())
                .andExpect(view().name("dashboard"))
                .andExpect(xpath("//a").nodeCount(1))
                .andExpect(model().attributeExists("canAddNewOrder"))
                .andExpect(model().size(2))
                .andExpect(model().attribute("var", equalTo("test")))
                .andExpect(model().attribute("canAddNewOrder", equalTo(false)))
                .andDo(print());
    }

}
java spring spring-boot mockmvc
2个回答
2
投票

通常,WebMvcTest 不会创建注入所有组件(服务等)的完整 Spring 上下文,而只会创建您定义的控制器。要么使用完整的 SpringBootTest,要么在 WebMvcTest 类中添加类似的内容:

@TestConfiguration
static class AdditionalTestConfig {
    @Bean
    public RolesManagerService getService() {
        return new RolesManagerService();
    }
}

0
投票

默认情况下,使用@WebMvcTest时不会扫描组件。 所以,如果你添加类似的东西..

@WebMvcTest(ClassicController.class)
@ComponentScan(basePackageClasses = {Service1.class, Dao1.class})
class WebMvcTest10Solution3 {

    @Test
    void test() {
        // your test code
    }

}

其中 Service1 是一个组件,例如..

@Service
public class Service1 {

    private final Dao1 dao1;
    public Service1(Dao1 dao1) {
        this.dao1 = dao1;
    }

}

Dao 组件是..

@Repository
public class Dao1 {
    
    // some code

}

它会完成这项工作。

© www.soinside.com 2019 - 2024. All rights reserved.