Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何编写数据库单元测试?_Java_Mongodb_Maven_Jdo_Mongodb Java - Fatal编程技术网

Java 如何编写数据库单元测试?

Java 如何编写数据库单元测试?,java,mongodb,maven,jdo,mongodb-java,Java,Mongodb,Maven,Jdo,Mongodb Java,我正在使用MongoDB、Java、JDO和Maven 我运行了一个简单的主应用程序,它存储了一些垃圾数据,并从mongodb中检索这些数据,看起来还可以,但我想开始编写适当的单元测试。模拟实际的数据库交互对我来说似乎没有多大帮助,所以从技术上讲,我想编写功能测试来检查与数据库的完整交互 我的单元测试设置如下: static final Logger LOG = LoggerFactory.getLogger(DaoTest.class); static final int PORT = 100

我正在使用MongoDB、Java、JDO和Maven

我运行了一个简单的主应用程序,它存储了一些垃圾数据,并从mongodb中检索这些数据,看起来还可以,但我想开始编写适当的单元测试。模拟实际的数据库交互对我来说似乎没有多大帮助,所以从技术上讲,我想编写功能测试来检查与数据库的完整交互

我的单元测试设置如下:

static final Logger LOG = LoggerFactory.getLogger(DaoTest.class);
static final int PORT = 100001;
static Process mongod;
static PersistenceManagerFactory pmf;

// Class under test.
Dao dao;

@BeforeClass
public static void beforeAll() throws Exception {
  File mongoDir = new File(
      System.getProperty("java.io.tmpdir"),
      "mongodb-" + System.currentTimeMillis());
  mongoDir.deleteOnExit();
  mongod = Runtime.getRuntime().exec(String.format(
      "/bin/sh -c mongod --dbpath=%s --port=%d",
      mongoDir.getAbsolutePath(),
      PORT));
  LOG.info("Mongodb using {} on port {}.", mongoDir.getAbsolutePath(), PORT);
  Thread.sleep(1000);
  pmf = JDOHelper.getPersistenceManagerFactory("mongodbtest");
  LOG.info("DB connection URL: {}.", pmf.getConnectionURL());
}

@AfterClass
public static void afterAll() throws Exception {
  mongod.destroy();
}

@Before
public void setUp() throws Exception {
  dao = new Dao(pmf);
}
<?xml version="1.0" encoding="UTF-8" ?>
<persistence ...>
  <persistence-unit name="mongodbtest">
    <properties>
      <property name="javax.jdo.PersistenceManagerFactoryClass"
          value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory" />
      <property name="javax.jdo.option.ConnectionURL" value="mongodb://localhost:100001/contacts"/>
      <property name="javax.jdo.option.RetainValues" value="true"/>
      <property name="datanucleus.autoCreateSchema" value="true" />
      <property name="datanucleus.validateTables" value="false" />
      <property name="datanucleus.validateConstraints" value="false" />
      <property name="datanucleus.storeManagerType" value="mongodb" />
    </properties>
  </persistence-unit>
</persistence>
src/test/resources/META-INF/persistence.xml如下所示:

static final Logger LOG = LoggerFactory.getLogger(DaoTest.class);
static final int PORT = 100001;
static Process mongod;
static PersistenceManagerFactory pmf;

// Class under test.
Dao dao;

@BeforeClass
public static void beforeAll() throws Exception {
  File mongoDir = new File(
      System.getProperty("java.io.tmpdir"),
      "mongodb-" + System.currentTimeMillis());
  mongoDir.deleteOnExit();
  mongod = Runtime.getRuntime().exec(String.format(
      "/bin/sh -c mongod --dbpath=%s --port=%d",
      mongoDir.getAbsolutePath(),
      PORT));
  LOG.info("Mongodb using {} on port {}.", mongoDir.getAbsolutePath(), PORT);
  Thread.sleep(1000);
  pmf = JDOHelper.getPersistenceManagerFactory("mongodbtest");
  LOG.info("DB connection URL: {}.", pmf.getConnectionURL());
}

@AfterClass
public static void afterAll() throws Exception {
  mongod.destroy();
}

@Before
public void setUp() throws Exception {
  dao = new Dao(pmf);
}
<?xml version="1.0" encoding="UTF-8" ?>
<persistence ...>
  <persistence-unit name="mongodbtest">
    <properties>
      <property name="javax.jdo.PersistenceManagerFactoryClass"
          value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory" />
      <property name="javax.jdo.option.ConnectionURL" value="mongodb://localhost:100001/contacts"/>
      <property name="javax.jdo.option.RetainValues" value="true"/>
      <property name="datanucleus.autoCreateSchema" value="true" />
      <property name="datanucleus.validateTables" value="false" />
      <property name="datanucleus.validateConstraints" value="false" />
      <property name="datanucleus.storeManagerType" value="mongodb" />
    </properties>
  </persistence-unit>
</persistence>
127.0.0.1:27017是mongodb的默认设置,但我不知道它为什么使用它。我可以看到它正在从persistence.xml文件中提取配置,所以我很困惑。mongo表示连接字符串URL格式为:

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
到目前为止,我只在maven中运行了这个程序,因为这只是我到目前为止所做的,但我最终要问的另一个问题是如何在Eclipse中运行这些单元测试。我假设这些测试必须在Eclipse中运行字节码增强过程,我不知道如何设置


我猜我不是第一个想做这种事情的人。有没有用Java编写功能数据库测试的标准实践?我完全错了吗?

来回答我自己的问题。有三个问题:

1) 连接字符串应为:

mongo:/127.0.0.1/contacts
(注1减去“/”)

2) 我需要添加mongoDir.mkdir()

3) 启动服务器的命令应为

String command = String.format(
    "/bin/sh -c mongod --dbpath=%s --port=%d", 
    mongoDir.getAbsolutePath(), 
    PORT);
Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", command });

实际上,我最终为此创建了一个JUnit4运行程序,这样我可以在所有测试中使用同一个数据库,并留待单独的测试来管理该数据库的状态。

如果您想运行一个要测试的数据库实例(该实例仅在Maven构建运行时运行)那么您可能会对我基于flapdoodle嵌入式Mongo API编写的Maven插件感兴趣:

一个好处是该插件自动下载Mongo发行版,因此用户无需在运行Maven构建之前安装Mongo。移动到不同的Mongo版本也很容易;您只需更改插件配置。

想想您的目标

我运行了一个简单的主应用程序,它存储了一些垃圾数据,并从mongodb中检索这些数据,看起来还可以,但我想开始编写适当的单元测试。

如果您在团队中工作,您将发现当前源代码存在问题。 如果您的另一个团队成员使用暂存数据库,该如何处理? 这将使您的数据毫无用处,不一致和痛苦的重现与数据库相关的错误

我认为@joelittlejohn的解决方案更好。在项目中使用嵌入式mongo。 目前我在我的项目中使用。 你可以毫不犹豫地用你的mongo做任何事情。
因为它是在运行测试时发生的,你看过nosql单元/jongo吗?我认为这是一个比从java代码运行mongod更好的解决方案。