Как издеваться над одними бобами, а не над другими в MockMVC? - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь написать модульный тест для контроллера. Некоторые зависимости (например, класс обслуживания) я издеваюсь с @MockBean. Но есть и другие зависимости, которые я хочу, чтобы Spring создавал бины как обычно. Возможно ли это?

@RunWith(SpringRunner.class)
@WebMvcTest(JwtAuthenticationController.class)
public class JwtControllerTests {

    @MockBean
    private JwtUserDetailsService jwtUserDetailsService;

    @MockBean
    private AuthenticationManager authenticationManager;

    @ ? ? ?
    private JwtTokenUtil jwtTokenUtil

    public void auth_Success() throws Exception {
        when(
            jwtUserDetailsService.loadUserByUsername(anyString())
        ).thenReturn(adminUserDetails);

        RequestBuilder request = MockMvcRequestBuilders
            .post("/api/v1/authenticate")
            .contentType(MediaType.APPLICATION_JSON)
            .content(authBody);
    }
}

Код контроллера:

public class JwtAuthenticationController {
    @Autowired
    private AuthenticationManager authenticationManager;
    @Autowired
    private JwtTokenUtil jwtTokenUtil;
    @Autowired
    private JwtUserDetailsService jwtUserDetailsService;
}

1 Ответ

0 голосов
/ 24 октября 2019

У вас есть @WebMvcTest.

Аннотация, которую можно использовать для теста Spring MVC, который фокусируется только на компонентах Spring MVC.

Вам необходимо использовать @SpringBootTest (классы= Application.class) и настройте свой MockMvc.

@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class JwtControllerTests {

    private MockMvc mockMvc;


    @MockBean
    private JwtUserDetailsService jwtUserDetailsService;

    @MockBean
    private AuthenticationManager authenticationManager;

    @Autowired
    private JwtTokenUtil jwtTokenUtil;


    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        this.mockMvc = MockMvcBuilders.standaloneSetup(new JwtAuthenticationController(authenticationManager,jwtUserDetailsService,jwtTokenUtil))
                .addInterceptors(interceptor)
                .setControllerAdvice(exceptionTranslator)
                .build();


    }

 @Test

public void auth_Success() throws Exception {
        when(
                jwtUserDetailsService.loadUserByUsername(anyString())
        ).thenReturn(adminUserDetails);

        RequestBuilder request = MockMvcRequestBuilders
                .post("/api/v1/authenticate")
                .contentType(MediaType.APPLICATION_JSON)
                .content(authBody);

         mockMvc.perform(request).andExpect(status().isOk());
    }

Измените свой JwtAuthenticationController для принятия зависимостей конструктором.

...