使用this article我现在想测试一些存储库。
我使用Moq来模拟存储库,并设置GetAll
和GetByID
方法。
单元测试通过,一切都很好。
但是当我在存储库类中注释GetAll()
中的代码并放入NotImplementedException()
时,单元测试仍然通过。
这是否意味着如果我对代码进行一些更改,GetAll()
的新实现可能会破坏我的代码,同时仍然允许我的测试通过?
答案 0 :(得分:3)
这意味着您的单元测试不完整:您必须测试有效和无效情况。当你表明自己:你想知道什么时候有效,但你也想知道什么时候失败。
考虑以下两个例子:
@Test(expected = PersonNotFoundException.class)
public void GetPerson_WithNonExistingId_ShouldThrowPersonNotFoundException(){
Person person = new PersonRepository().getPersonById(-1);
}
@Test
public void GetPerson_WithExistingId_ShouldReturnPerson(){
Person person = new PersonRepository().getPersonById(5);
Assert.AssertNotNull(person);
}
现在你有两个测试可以验证方法在它应该工作时和不应该工作时的行为。如果您现在突然将PersonRepository.getPersonById(int)
的实现更改为始终抛出PersonNotFoundException
,那么您的第一个测试仍然会成功,但另一个测试不会。
建议验证不同输入路径的频谱。这通常包括
null
值等
我意识到Moq是C#,而不是Java。这个想法虽然与语言无关,但代码本身就说明了一切。