我使用的是PowerMock 1.4.12和JUnit 4.8.1。我在获取返回我想要的数据的方法时遇到了问题。我有
@Before
public void setUp() throws Exception
{
...
userService = createMock(UserService.class);
loginController.setUserService(userService);
…
}
@Test
public final void testAuthenticateForLoggedInAdmin()
{
authorities.add(adminAuthority);
final User user = new User();
user.setUserName("userName");
user.setPassword("password");
user.setFirstName("firstName");
user.setMiddleName("middleName");
user.setLastName("lastName");
user.setUrl("localhost");
user.setId("id1");
final TestsubcoAuthenticationUser principal = new TestsubcoAuthenticationUser(user.getUserName(),
user.getPassword(),
true,
true,
true,
true,
authorities,
user.getFirstName(),
user.getLastName(),
user.getMiddleName(),
user.getUrl(),
user.getId(),
null,
null,
null);
authentication = new UsernamePasswordAuthenticationToken(principal, new Object(), authorities);
securityContext.setAuthentication(authentication);
mockStatic(SecurityContextHolder.class);
expect(SecurityContextHolder.getContext()).andReturn(securityContext);
expect(userService.findByUsernameAndUrl(user.getUserName(), user.getUrl())).andReturn(user);
...
String result = loginController.authenticate();
但是当我的方法从控制器内部被调用时,
final User user = userService.findByUsernameAndUrl(sbUser.getUsername(), sbUser.getUrl());
返回值为空,而不是我指定的对象。这背后有什么理论或进一步故障排除的建议吗?我已经通过调试验证,在控制器中传递的String参数值与我在"expect"方法中指定的值相同。
看起来您没有在mock上调用replay
。
重播
but when my method in question gets called from within the controller,
我不确定你的意思,问题中的方法从控制器内调用。当你调用这个方法时,你的userService对象应该是你模拟的那个对象。如果参数值相同,也检查参数值。
如果你不觉得这有用,在这里分享你试图进行单元测试的更多细节。