【问题标题】:Junit test case for user password reset用户密码重置的Junit测试用例
【发布时间】:2015-07-12 17:00:55
【问题描述】:

我是 Junit 测试用例的新手,有人可以通过以下方式取悦我。

我需要为用户密码重置编写一个 junit 测试用例。我不确定如何在这里使用断言:

public @ResponseBody userInfo updatePassword(@RequestBody Map<String, String> userLookup, HttpServletRequest request) {
        userInfo userInfo = new userInfo();
        try {
            Users user = Service.getUserDetailsByUsername(userLookup.get("username"));
            user.setPassword(userLookup.get("newPassword"));
            Service.updateUserPw(user);
            logger.debug("Password updated successfully");
        } catch (Exception ex) {
            logger.debug("Error while updating user password!", ex);
        }
        return userInfo;
    }



    method:getUserDetailsByUsername returns a user with the username passed.
    method:setPassword returns return void
    method: updateUserPw returns void 

【问题讨论】:

  • 您正在尝试断言无效返回方法,请您检查此链接stackoverflow.com/questions/16043819/junit-testing-void-methods
  • 鉴于这是一个控制器,您是否尝试通过 spring mvc 进行测试?通过“http”是什么意思?还是您想要一个不包含 http 的单元测试?
  • 我可以不考虑 http。

标签: java spring spring-mvc junit junit4


【解决方案1】:

要编写 JUnit 测试,您必须首先创建并填充调用所需的所有对象和参数:

@Test
public void updatePasswordWithAValidPassword()
{
    MyObject my=new MyObject();
    Map<String, String> userLookup=new HashMap<String, String>();
    userLookup.put("username", "...");
    userLookup.put("newPassword", "january209");
    HttpServletRequest request=null; // Fortunately, this method does not use the request parameter.

其次,执行调用:

    userInfo user=my.updatePassword(userLookup, request);

最后,使用Assert.assert* 和Assert.fail 检查结果:

    Assert.assertEquals("january209", user.getPassword());
}

为了达到较高的代码覆盖率,您应该为您的方法在执行时可能具有的每种可能的替代方式编写一个测试。在这种情况下,应该有一个成功更改密码的测试(上面的示例),以及在更改密码时产生异常的其他测试(可能引入空密码,或者安全级别低的密码 - 太短, ETC)。但是,不幸的是,鉴于代码本身,调用者(=JUnit 测试者)很难知道何时发生了异常,因为它会被系统地捕获并忽略给调用者。

如果你想编写这样的测试,你必须首先重构你的方法删除catch (Exception e),并让异常传播给调用者(假设每种情况都有特定的异常:PasswordTooShortExceptionInvalidNullPasswordException,等),所以你可以从测试人员那里捕捉到它。

【讨论】:

  • 嗨,Little Santi - 你能帮我理解你的代码吗?提前谢谢。
  • 我上面的代码是一个关于如何测试你的方法 updatePassword 的例子。您需要将它封装到一个通常名为 *Test 的类中并使用 JUnit 运行它。
  • 我无法理解:userInfo user=my.updatePassword(userLookup, request);
  • 这是调用您的方法 updatePassword、传递适当的参数并将结果接收到 userInfo 对象的行,因为它是您在问题中包含的代码的标志。
猜你喜欢
  • 1970-01-01
  • 2013-04-08
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多