【问题标题】:Junit5 Mockito @InjecctMocks not working with MockMvcJunit5 Mockito @InjecctMocks 不与 MockMvc 一起使用
【发布时间】:2019-11-18 18:39:33
【问题描述】:

MockMvc 调用控制器但无法在控制器类中创建 @Autowired 对象: AuthControllerTest.java

@ExtendWith(SpringExtension.class)
@ExtendWith(MockitoExtension.class)
class AuthControllerTest {

    private MockMvc mockMvc;

    @InjectMocks
    private AuthController authController;

    @BeforeEach
    void setUp() {
        mockMvc = MockMvcBuilders.standaloneSetup(authController)
                .build();
    }

    @Test
    void getToken() throws Exception{
        mockMvc.perform(post("/auth/token")
                .contentType(MediaType.APPLICATION_JSON)
                .content("{\"username\" : \"Santa Clause\", \"password\" : \"1223\" }")
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.status").value("Success"))
                .andExpect(jsonPath("$.result").exists())
                .andExpect(jsonPath("$.result.username").exists())
                .andExpect(jsonPath("$.result.token").exists())
                .andDo(print());
    }
}

AuthController.java

@RestController
@RequestMapping("/auth")
public class AuthController extends ContextService {

    private static final Logger logger = LoggerFactory.getLogger(AuthController.class);

    @Autowired
    IAuthManagement authManagement;

    @PostMapping("/token")
    public ResponseEntity getToken(@RequestBody AuthenticationDTO data) throws UserException {
        logger.info("\nCreating a new Token for user from credentials passed. *** "+data.getUsername()+"-->"+data.getPassword()+"-->"+authManagement);
        return authManagement.getToken(data);
    }

输出:

Creating a new Token for user from credentials passed. *** Santa Clause-->1223-->null
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException

    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)

@InjectMocks 没有注入任何东西,因为 authManagement 为 null,因此会出现 nullPointerException。 谁能帮我解决这个问题。

【问题讨论】:

    标签: java spring-boot junit mockito junit5


    【解决方案1】:

    你需要模拟IAuthManagement authManagement;

    在您的测试类中添加类似这样的内容..

    @Mock
    IAuthManagement authManagement;
    

    除此之外,您还必须模拟您的服务方法。 https://www.petrikainulainen.net/programming/spring-framework/unit-testing-of-spring-mvc-controllers-normal-controllers/

    在上面的教程中看一下测试类,第 50 行,你必须做类似..when() 这样它就不会返回 null

    【讨论】:

    • 现在控制器层正在工作,但服务层返回空值。
    • @Rick:我认为您将不同的概念混合在一起。要么你想使用spring 来设置你的依赖(又名IntegrationTest),要么你使用mockito 来模拟依赖(又名UnitTest)。
    • 我已经编辑了我的答案,增加了一个步骤。
    猜你喜欢
    • 2016-09-19
    • 2020-12-31
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多