Java 如何测试方法是否计算出正确的结果?
这听起来比我的意思更模糊,但在类中测试方法时,正确的过程是什么 e、 g.customer类将设置密码的md5哈希保存到db,而不是实际密码。customer类中的一个私有方法计算md5哈希值以进行保存Java 如何测试方法是否计算出正确的结果?,java,testing,Java,Testing,这听起来比我的意思更模糊,但在类中测试方法时,正确的过程是什么 e、 g.customer类将设置密码的md5哈希保存到db,而不是实际密码。customer类中的一个私有方法计算md5哈希值以进行保存 public class Customer() { public void setPassword(String password){ this.password = hashPassword(password); } private String hashPassword(String
public class Customer() {
public void setPassword(String password){
this.password = hashPassword(password);
}
private String hashPassword(String password){
..do stuff..
}
.. other methods ..
}
现在这只是一个例子,我不想知道如何计算md5散列等等。这是关于测试的。以下是我能想到的选择:
我在测试类中创建了一个与hashPassword相同的方法,然后比较结果。
我手动计算特定密码myPassword的结果,并将其存储为常量。在测试中将密码设置为myPassword后,我会将常量与结果进行比较。
还有第三种选择 您可以使用该库,它允许您使用反射测试私有方法,但它隐藏了反射的复杂性 示例:要通过方法setValue将对象obj的值设置为100:
PrivateAccessor.invoke( obj, "setValue", new Class[]{int.class}, new Object[]{
new Integer( 100 )} );
如果对象具有基元类型,则该方法返回的值将自动包装在对象中。还有第三个选项 您可以使用该库,它允许您使用反射测试私有方法,但它隐藏了反射的复杂性 示例:要通过方法setValue将对象obj的值设置为100:
PrivateAccessor.invoke( obj, "setValue", new Class[]{int.class}, new Object[]{
new Integer( 100 )} );
如果对象具有基元类型,则该方法返回的值将自动包装在对象中。您应选择第二个选项,即预计算值或值序列,并使用它们进行测试。使用同一方法的副本测试一个方法除了增加代码复制量之外没有其他用途。您应该选择第二个选项,即预先计算一个值或一个值序列,然后使用它们进行测试。使用同一方法的副本测试一个方法除了增加代码复制量外没有其他用途。从选项2开始,我将使用openssl计算它并存储它,以便以后比较:从选项2开始,我将使用openssl计算并存储它,稍后比较:执行此操作 我手动计算特定密码myPassword的结果,并将其存储为常量。在测试中将密码设置为myPassword后,我会将常量与结果进行比较 通过将实现与同一精确实现的结果进行比较来测试实现是没有意义的。这样做 我手动计算特定密码myPassword的结果,并将其存储为常量。在测试中将密码设置为myPassword后,我会将常量与结果进行比较
通过将实现与同一个精确实现的结果进行比较来测试实现是没有意义的。我不会使用相同的算法,因为您可能会在两个实现中实现相同的错误。我不会手动计算,因为这种手动计算可能是错误的。相反,我将使用一些参考输入,并检查算法的输出是否与参考输出相同。见:
现在,如果您信任MD5的实现,并且只想检查是否调用了digester,那么可以插入一个模拟MD5 digester,并检查在设置密码时是否调用了模拟digester。我不会使用相同的算法,因为您可能会在这两个实现中实现相同的bug。我不会手动计算,因为这种手动计算可能是错误的。相反,我将使用一些参考输入,并检查算法的输出是否与参考输出相同。见:
现在,如果您信任MD5的实现,并且只想检查是否调用了digester,那么可以插入一个模拟MD5 digester,并检查在设置密码时是否调用了模拟digester。我肯定会采用第二种方法。您最不希望的事情是让您的测试代码在测试单元中复制功能 存储已知纯文本和哈希结果的列表。 添加一个用纯文本调用setPassword的测试 添加一个方法来检查散列值-如果要添加此包进行测试,请使其可见
这里的好处是您没有测试hashPassword方法。您正在验证密码哈希是否正确。您的测试代码甚至不应该知道或关心私有方法是否存在。我想问您是否应该测试密码是否是散列的,因为这确实是Customer类的实现秘密,但是您可能有很好的理由来测试它。我肯定会采用第二种方法。您最不希望的事情是让您的测试代码在测试单元中复制功能 存储已知纯文本和哈希结果的列表。 添加一个测试,该测试可以 使用纯文本设置密码 添加一个方法来检查散列值-如果要添加此包进行测试,请使其可见
这里的好处是您没有测试hashPassword方法。您正在验证密码哈希是否正确。您的测试代码甚至不应该知道或关心私有方法是否存在。我想问您是否应该测试密码是否是散列的,因为它实际上是Customer类的一个实现秘密,但是您可能有很好的理由来测试它。我假设您想要测试私有方法,因为它包含一些重要的逻辑。也许最好的方法是将该方法的主体移动到某个外部类 您的代码片段就是一个很好的例子—计算MD5应该在Customer类之外完成—这不是所谓Customer的责任
private String hashPassword(String password) {
this.hash = PasswordHasher.hash(password)
}
稍后,publicordefault/protectedstringpasswordhashherhashstring很容易测试我假设您想测试private方法,因为它包含一些重要的逻辑。也许最好的方法是将该方法的主体移动到某个外部类 您的代码片段就是一个很好的例子—计算MD5应该在Customer类之外完成—这不是所谓Customer的责任
private String hashPassword(String password) {
this.hash = PasswordHasher.hash(password)
}
后来publicor default/protected String PasswordHasherhashString很容易测试虽然我没有特别要求md5测试帮助,但这确实很有用,我一定会在测试中实现它。谢谢。虽然我没有特别要求md5测试帮助,但这确实很有用,我一定会在我的测试中实现它。谢谢。我知道这不是重点,但很可能你不应该使用MD5进行密码哈希,也不应该添加盐。谢谢你的想法。这是一个小型项目,只是作为学习Android的后端。但我将在未来研究SHA算法等,以提高最终产品的质量,即使它只是一个演示。请注意,虽然有一些关于测试私有方法的重要问题,特别是测试私有方法的愿望告诉了您关于程序设计的什么,该方法的私密性似乎与这个特定问题无关。我知道这不是重点,但很可能你不应该使用MD5进行密码哈希,也不应该添加一个salt。谢谢你的想法。这是一个小型项目,只是作为学习Android的后端。但我将在未来研究SHA算法等,以提高最终产品的质量,即使它只是一个演示。请注意,虽然有一些关于测试私有方法的重要问题,特别是测试私有方法的愿望告诉了您关于程序设计的什么,这种方法的私密性似乎与这个问题无关。