我可以依靠(单个)单元测试来验证被测单元的有效和无效状态吗?

时间:2014-05-17 19:33:16

标签: unit-testing moq

使用this article我现在想测试一些存储库。

我使用Moq来模拟存储库,并设置GetAllGetByID方法。 单元测试通过,一切都很好。

但是当我在存储库类中注释GetAll()中的代码并放入NotImplementedException()时,单元测试仍然通过。

这是否意味着如果我对代码进行一些更改,GetAll()的新实现可能会破坏我的代码,同时仍然允许我的测试通过?

1 个答案:

答案 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。这个想法虽然与语言无关,但代码本身就说明了一切。

相关问题