2010-12-10 71 views
6

因为我不是真正的数据库精通,有些细节可能是irrlevant,但我会包括一切:嘲笑一个MySQL服务器与Java

正如我在大学的一个项目的一部分,我们正在创建一个网站使用JSP,servlet并使用MySQL服务器作为后端。

我负责设置数据库上的表,并创建Java类来与它交互。但是,我们只能从大学内部连接到MySQL服务器,而我们全部(7人)主要在家工作。

我正在创建一个接口QueryHandler,它有一个方法需要一个字符串(代表查询)并返回ResultSet。我的问题是:如何创建一个实现此接口的类,它将模拟数据库并允许其他人使用不同的DBHandler,并且不知道其差异,并允许我在不连接到实际MySQL数据库的情况下测试不同的查询?

编辑:我不太确定SQL数据库之间的差异,但显然我在MySQL上运行的所有查询都应该在模拟上运行。

+2

我认为编写这样一个类要比让每个组成员安装MySQL并在他们的计算机上设置数据库更加费力...... +1创造力:) – BoltClock 2010-12-10 15:07:40

回答

6

为什么不只是安装自己的MySQL数据库进行测试?它运行在Windows,Mac和Linux上,并不是太重的资源。我已将它安装在笔记本电脑上进行本地测试。

+4

这不是问题吗与单元测试等?由于模拟服务器本身不在我们的主干(我们使用SVN) - 即其他人将无法使用它。 – 2010-12-10 15:08:12

+1

@amir,每个开发人员的计算机应该有它的MySQL。在现实世界中提供用于开发的数据库是标准做法。在这种情况下,将dbs放在学生的电脑上。 – hvgotcodes 2010-12-10 15:09:26

+0

如果MySQL是开发环境的一个标准部分,并且单元测试@BeforeClass确保表和数据设置正确,那么您就是黄金。 – 2010-12-10 15:10:53

1

尝试derby。这是一个免费的服务器,您可以使用它来测试,如果您不介意在返回到SqlServer时必须更改驱动程序。尽管您可以运行的查询类型可能有限。我不确定SqlServer是否具有标准SQL之外的特殊语法。

1

如何使用HSQLDB进行离线测试?它不会像MySQL数据库一样运行,但是它是一种快速的内存SQL DB,可以满足大多数需求。

1

根据我的经验,最好的方法是多个数据库实例和或模式。通常情况下,每个用户都有一个针对正在运行的应用程序进行/ sanity检查的开发,一个针对运行单元测试的自动构建,最好每个用户针对每个用户运行单元测试。当然还有演示/集成测试的实例/模式。除了实践方面,能够做到这一点确保了应用程序/数据库的部署/升级也相当接近完美。

假设你有一个DAO层,在单元测试级别唯一需要访问真实数据库的代码是DAO实现,业务层应该使用模拟DAO实现。

2

您的API似乎有缺陷。您不应该将ResultSets返回给客户端。通过这样做,您永远会迫使您的客户依赖关系数据库后端。您的数据访问层需要隐藏数据实际结构和存储方式的所有细节。

而不是返回一个ResultSet,请考虑返回一个List或允许客户端提供您的数据访问组件可以写入的Stream。

这将使得单元测试对于API的客户端而言是微不足道的,并且允许您随意交换存储机制。

+0

通常返回什么而不是ResultSet? List如何提供相同的功能? – 2010-12-10 18:53:26