Java 单元测试中的测试副作用

Java 单元测试中的测试副作用,java,unit-testing,junit,Java,Unit Testing,Junit,如果您需要测试副作用,我想知道什么时候我们的单元测试代码。例如,如果我有一个带有lockItem(BaseItem)方法和unlockItem(BaseItem)方法的锁。我们是否应该测试该方法只锁定我们的元素而不锁定另一个元素,就像解锁一样 谢谢您的回答一般来说,您不会测试为阴性。意思是不要测试代码没有做什么,测试它做什么。因此,不需要测试方法锁定的对象,只需测试它锁定的元素即可。如果您尝试走另一条路,就像说“我有一个素数生成器,我需要测试它是否不会写入文件系统。”一般来说,目标是测试可能出错

如果您需要测试副作用,我想知道什么时候我们的单元测试代码。例如,如果我有一个带有lockItem(BaseItem)方法和unlockItem(BaseItem)方法的锁。我们是否应该测试该方法只锁定我们的元素而不锁定另一个元素,就像解锁一样


谢谢您的回答

一般来说,您不会测试为阴性。意思是不要测试代码没有做什么,测试它做什么。因此,不需要测试方法锁定的对象,只需测试它锁定的元素即可。如果您尝试走另一条路,就像说“我有一个素数生成器,我需要测试它是否不会写入文件系统。”

一般来说,目标是测试可能出错的任何东西。如果您的实现无法想象另一个元素可能被错误锁定,那么您可能会认为它不值得测试。然而,不可思议的错误发生的频率比您预期的要高。而且,您的函数不应该有副作用。几乎从未有过。否定测试的整个概念是围绕着验证不应该发生的可预见的事情不会发生的想法而设计的。否定测试在这种情况下确实有一些价值,因为您希望确保锁定/解锁功能选择正确的元素。我曾经有过一些令人讨厌的错误,当我写的懒惰代码解锁了我并不真正拥有的东西时。因此我建议测试应该测试它是否锁定了适当的东西,但是测试它是否没有锁定任何其他东西对我来说似乎很奇怪。您是否测试系统中的任何其他对象是否未获得锁?您是否在每次向系统添加新对象时都添加测试?显然,不可能也不希望测试所有不应该测试的方法(有无限的可能性,因为一个方法在进行计算时不访问文件系统或通过网络发送请求)。但是,如果在锁定方法的情况下,如果使用单元测试作为回归测试,那么检查锁定方法是否没有解锁一个项或锁定多个项是很有趣的。因此,在重构时,如果有多个项,则该方法会在不应该锁定的情况下锁定或解锁一个项。单元测试失败并尽快修复错误(通过持续集成)。