如何在PowerMock中模拟方法?

时间:2013-06-06 21:54:49

标签: junit mocking powermock

我正在使用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());

返回值为null而不是我指定的对象。任何理论背后的理由或进一步的故障排除建议?我已通过调试验证控制器中传递的String参数值与我在“expect”方法中指定的相同。

2 个答案:

答案 0 :(得分:1)

看起来你没有在你的模拟上打电话给replay

replay

答案 1 :(得分:0)

but when my method in question gets called from within the controller,

我不确定你的意思是什么,方法会从控制器中调用。 调用方法时, userService 对象应与您模拟的对象相同。如果相同,也检查参数值。

我没有找到这个有用的,在这里尝试单元测试分享更多细节。