Mockito.when()在模拟Autowired对象时无法正常工作

时间:2016-12-30 13:00:54

标签: java junit mockito

我有一个conrtoller类,我在其中获取有关当前登录用户的详细信息。方法名称是' LoggedInUser()'。该方法一般运行良好,但我无法针对特定方法生成单元测试用例。

为了测试它,我使用的是Mockito但是' Mockito.when()'工作不正常。 我经历了所有相关问题,但无法解决。

以下是我迄今为止所做的事情。

Controller.java

    @Service
    @Transactional
    Public class Controller implements someInterface {

private LoggedInUser getUser(HttpServletRequest request) {
            principal = request.getUserPrincipal();
            Authentication tk = (Authentication) principal;
            //Authentication tk = (Authentication)(request.getUserPrincipal());
            LoggedInUser user = (LoggedInUser) tk.getPrincipal();
            return user;
        }

评论中的行是写的,因为我在另一篇文章中读到它可能无法作为' principal'再次实例化。所以我试图绕过它,但那并没有起作用。

Test.java

@Mock
    private HttpServletRequest httpServletRequest;

public void tes() {
        //httpServletRequest = Mockito.mock(HttpServletRequest.class);
        Principal principal= Mockito.mock(Principal.class);
        Mockito.when(httpServletRequest.getUserPrincipal()).thenReturn(principal);
.......
.......
}

在调试时,我正在获得request (object of HttpServletRequest)的价值,因为它在控制器类中是自动装配的,但principal始终为空。 任何帮助将不胜感激!!

3 个答案:

答案 0 :(得分:2)

您是否在此测试类中添加了@RunWith(MockitoJUnitRunner.class)?因为只有这样@Mock才会起作用。我假设你将嘲笑的HttpServletRequest传递给getUser()

答案 1 :(得分:0)

您尚未注入模拟对象httpServletRequest。您需要将此模拟对象传递给getUser方法进行测试。

答案 2 :(得分:0)

我无法模拟HttpServletRequest,因为它是Autowired,因此request.getUserPrincipal()始终保持为Null,因为它从不调用mock()。when method。 我以下面的方式替换了代码!!

Controller.java

    @Service
    @Transactional
    Public class Controller implements someInterface {

    public LoggedInUser getUser() {
        LoggedInUser user = (LoggedInUser )SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        return user;
    }

Test.java

    @Mock
    private Principal principal;

    @Mock
    private SecurityContext securitycontext;

    @Mock
    private Authentication authentication;
     public void test() {
      LoggedInUser user = new LoggedInUser();
        Mockito.when(authentication.getPrincipal()).thenReturn(user);
        Mockito.when(securitycontext.getAuthentication()).thenReturn(authentication);
        SecurityContextHolder.setContext(securitycontext);
.......
.......
}