我熟悉 TDD 的基本原则,即:
- 编写测试,这些会因为没有实现而失败
- 编写基本实现以使测试通过
- 重构代码
但是,我对接口和实现适合的位置有点困惑。我在业余时间创建了一个 Spring Web 应用程序,而不是大吵大闹,我想了解如何更好地测试接口/实现,以我在这里创建的这个简单的示例代码为例:
public class RunMe
{
public static void main(String[] args)
{
// Using a dummy service now, but would have a real implementation later (fetch from DB etc.)
UserService userService = new DummyUserService();
System.out.println(userService.getUserById(1));
}
}
interface UserService
{
public String getUserById(Integer id);
}
class DummyUserService implements UserService
{
@Override
public String getUserById(Integer id)
{
return "James";
}
}
我已经创建了UserService
接口,最终会有一个真正的实现来查询数据库,但是为了让应用程序脱离实际,我已经替换了一个DummyUserService
现在只返回一些静态数据的实现。
问题:如何实施上述测试策略?
我可以创建一个名为的测试类DummyUserServiceTest
并测试当我调用getUserById()
它时它会返回James
,如果不是浪费时间的话,看起来很简单(?)。
随后,我还可以创建一个测试类,该类RealUserService
将测试getUserById()
从数据库中返回用户名。这是让我有点困惑的部分,这样做,这是否本质上没有超出单元测试的边界并变得更像是一个集成测试(在数据库上的命中)?
问题(改进了一点):当使用带有虚拟/存根和真实实现的接口时,应该对哪些部分进行单元测试,哪些部分可以安全地不测试?
昨晚我花了几个小时在谷歌上搜索这个主题,主要是找到关于什么是 TDD 的教程,或者如何使用 JUnit 的示例,但在建议实际测试什么的领域中没有任何内容。不过,完全有可能是我搜索不够努力或没有寻找正确的东西......