你会如何断言这样的代码?这样做的最佳方法是什么?
public void doSomething(int myProperty){
if (myProperty == 0) return;
// If myProperty is not zero, do something in the method
}
答案 0 :(得分:7)
如果此代码没有返回任何内容,它的目的是什么?如果删除此行会出现什么问题?
如果您对这些问题找到了有价值的答案,您会发现有关测试代码的提示。
如果您没有找到答案,那么您可以安全地删除该行(因此无需编写测试)。
答案 1 :(得分:4)
无论您做什么,都需要针对可观察效果进行测试。当然你的方法必须做某事。
使用基于状态的测试时,您可以在执行方法后检查SUT或Fixture的状态,以查看状态是否符合您的预期。
如果无法做到这一点,您需要执行Behavior Verification(又名基于交互的测试。这通常通过模拟对象来完成。
答案 2 :(得分:3)
您可以断言return
在<{1}}为零时发生后发生的任何事情。
例如,如果方法是(伪代码!)
myProperty
那么你的单元测试可以
if myProperty == 0 return
myOtherProperty = 2
设置为零,myProperty
设置为myOtherProperty
以外的其他内容2
仍设置为之前的设置。答案 3 :(得分:1)
我认为Mark Seemann给了你完整的答案 - 这只是一个例子。
SomeVerifiableClass actor;
public void doSomething(int myProperty){
if (myProperty == 0) return;
// If myProperty is not zero, do something in the method
actor.doesSomething(myProperty);
}
然后你的选择是模拟 SomeVerifiableClass 或用真实的测试。如果你正确使用DI,那么模拟是一个更好的选择。
模拟:验证行为(伪代码):
verify(mockedActor).noMethodsCalled();
如果是真实对象,则验证状态:
assert(isPrestine(actor));
如果您的案例中没有演员,那么您应该能够验证测试对象的状态(执行 doSomething 的状态)。
答案 4 :(得分:0)
当我看到这个时,我问的问题是:当myProperty不为零时会发生什么?
此返回后是否有代码改变类级别/共享状态?你可以断言类级别/共享状态来验证行为吗?
当myProperty为零时,状态应该不受方法
的影响答案 5 :(得分:0)
你没有发布方法签名,所以我认为它有返回类型的void。在这种情况下,没有办法像你指出的那样测试它;但是如果方法与对象范围属性交互,则可以测试它们以查看它们是否发生了变化。