Unit testing 单元测试期间的隔离和测试数据的重复代码

Unit testing 单元测试期间的隔离和测试数据的重复代码,unit-testing,tdd,Unit Testing,Tdd,我正在用Java开发一些应用程序并编写JUnit测试。我有一个关于单元测试的设计问题。我有一个类,通过读取不同的行并基于某种算法进行解析,读取一个文件并创建名为Song的对象。我已经为此编写了一些单元测试。解析后的下一步是根据歌曲对象的某些属性将该歌曲实际转换为不同的格式。我还有一个班是做翻译的。有一种方法translate将歌曲对象作为输入。现在是翻译器的单元测试。我需要一个具有所有有效属性的Song对象。我在这里感到困惑的是,我应该通过在解析器中添加相同的功能来创建一个新的Song对象,还是

我正在用Java开发一些应用程序并编写JUnit测试。我有一个关于单元测试的设计问题。我有一个类,通过读取不同的行并基于某种算法进行解析,读取一个文件并创建名为Song的对象。我已经为此编写了一些单元测试。解析后的下一步是根据歌曲对象的某些属性将该歌曲实际转换为不同的格式。我还有一个班是做翻译的。有一种方法translate将歌曲对象作为输入。现在是翻译器的单元测试。我需要一个具有所有有效属性的Song对象。我在这里感到困惑的是,我应该通过在解析器中添加相同的功能来创建一个新的Song对象,还是应该调用解析器服务来为我这样做。我觉得如果我采取第二种选择,它将不会被孤立。但在第一个选项中,它就像重复的代码。有人能指导我吗?

当数据复杂时,使用生成器为SUT调用创建输入数据没有什么错,但是我在这里看到了两个风险

  • 如果构建器失败,您的测试也会失败,但它不应该失败。正如您所说的,单元测试应该与外部代码隔离
  • 如果您使用代码覆盖率作为衡量单元测试好坏的指标(我不是说这是对的),通过查看构建器的覆盖率,您可能会认为它已经过测试,但显然不是

我的意见是,没有一个最佳的解决方案适合所有的情况。如果输入数据不是很复杂,请尝试“手动”构建,否则请使用生成器。

为什么不能通过调用其构造函数创建一首歌曲,然后调用translateor?为什么创建一个新的Song对象就需要读取一个文件?@JBNizet我理解你的评论,但Song对象不是一个简单的对象,它有一些名称和id属性。它也有一些反映数字信号的字符串。算法将此数字信号转换为特定字符串。而在没有算法的情况下创建那个字符串,以便译者能够正确地翻译它是很困难的,而且可能是肮脏的。以防明天我们生成数字到字符串的方式发生变化。更新翻译测试将是一团混乱,而且很难维护。好的。然后,我将把一个测试文件放在测试源代码中,并解析它来创建一首测试歌曲。当然,您的测试也将依赖于解析器,但我看不到任何更好的解决方案。