我有一个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
始终为空。
任何帮助将不胜感激!!
答案 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);
.......
.......
}