Java 在带有Spring3JUnit测试的语句中找不到HSQLDB表

Java 在带有Spring3JUnit测试的语句中找不到HSQLDB表,java,sql,spring,junit,hsqldb,Java,Sql,Spring,Junit,Hsqldb,我有两个jUnit测试类,一个用于测试我的ItemService类,另一个用于测试我的LocationService类。当我运行ItemService测试时,它通过了。当我运行LocationService测试时,它失败,原因是: 原因:java.sql.SQLException:在语句[SELECT COUNT(*)FROM locations]中找不到表 位于org.hsqldb.jdbc.Util.throwError(未知源) 位于org.hsqldb.jdbc.jdbcPrepared

我有两个jUnit测试类,一个用于测试我的
ItemService
类,另一个用于测试我的
LocationService
类。当我运行
ItemService
测试时,它通过了。当我运行
LocationService
测试时,它失败,原因是:

原因:java.sql.SQLException:在语句[SELECT COUNT(*)FROM locations]中找不到表 位于org.hsqldb.jdbc.Util.throwError(未知源) 位于org.hsqldb.jdbc.jdbcPreparedStatement。(来源未知) 位于org.hsqldb.jdbc.jdbcConnection.prepareStatement(未知源)

我将一个模式文件加载到数据库中,它创建的第一个表是
ItemService
使用的表。可能my
LocationService
测试使用的
locations
表没有创建,即使它位于同一个架构文件中

这在我的test-context.xml文件中:

<jdbc:embedded-database
    id="myTestDB"
    type="HSQL">
    <jdbc:script
        location="classpath:/test-ddl.sql" />
    <jdbc:script
        location="classpath:/test-data.sql" />
</jdbc:embedded-database>

<bean
    id="dataSourceTest"
    class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property
        name="driverClassName"
        value="org.hsqldb.jdbcDriver" />
    <property
        name="url"
        value="jdbc:hsqldb:mem:myTestDB" />
    <property
        name="username"
        value="sa" />
    <property
        name="password"
        value="" />
</bean>
在表创建语句之后,我还在模式中设置了一些
UNIQUE
FOREIGN KEY
约束,但它肯定会告诉我它是否无法创建某些内容。我正在使用HSQLDB1.8.1.3 JAR。为什么我不能查询
位置
,但我可以查询
项目

编辑:考虑到可能存在区分大小写的问题,但即使尝试从
位置
表中选择,也会失败:

原因:java.sql.SQLException:在语句[SELECT COUNT(*)FROM LOCATIONS]中找不到表

编辑:我的魔法工作
ItemService
测试:

@ContextConfiguration("/test-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration(transactionManager = "transactionManager")
public class ItemServiceTest {
    private EmbeddedDatabase _db;
    private ItemService _svc;

    @Before
    public void setUp() throws Exception {
        _db = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.HSQL)
            .setName("myTestDB").build();
        assertThat(_db, is(notNullValue()));
        _svc = new ItemService();
        _svc.setDataSource(_db);
    }

    @After
    public void tearDown() throws Exception {
        _db.shutdown();
    }

    @Test
    public void testGetCount() {
        assertThat(_svc.getCount(), is(not(0)));
    }
}
我的
LocationService
测试失败与此完全相同,但使用的是
LocationService
而不是
ItemService
getCount()
方法显示在
LocationService
ItemService
中:

public int getCount() {
    String sql = "SELECT COUNT(*) FROM " + TABLE_NAME;
    return _jdbcTmpl.queryForInt(sql, (Map<String, Object>)null);
}
public static final String TABLE_NAME = "ITEMS";
public static final String TABLE_NAME = "LOCATIONS";
位置服务

public int getCount() {
    String sql = "SELECT COUNT(*) FROM " + TABLE_NAME;
    return _jdbcTmpl.queryForInt(sql, (Map<String, Object>)null);
}
public static final String TABLE_NAME = "ITEMS";
public static final String TABLE_NAME = "LOCATIONS";
ItemService
LocationService
都具有以下功能:

private NamedParameterJdbcTemplate _jdbcTmpl;

@Resource(name = "dataSource")
public void setDataSource(DataSource dataSource) {
    _jdbcTmpl = new NamedParameterJdbcTemplate(dataSource);
}
编辑:问题的新扭曲。在我的
LocationService
测试中,我有一些其他的测试方法尚未充实,例如

@Test
public void testFind() {
    fail("Not yet implemented");
}
而在我的
ItemService
测试中,唯一的
@test
方法是通过的
testGetCount
。当我将上面的
testFind
添加到
ItemService
测试类时,它的
testGetCount
突然失败,就像在我的
LocationService
测试类中一样:

原因:java.sql.SQLException:在语句[SELECT COUNT(*)FROM ITEMS]中找不到表

编辑:当我不使用
static
@BeforeClass
/
@AfterClass
方法时(即,当测试找不到表时),我逐步使用调试器,我注意到以下控制台输出:

2012年4月10日上午10:22:44 org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory initDatabase 信息:正在创建嵌入式数据库“myTestDB” 2012年4月10日上午10:22:44 org.springframework.jdbc.datasource.init.ResourceDatabasePopulator executeSqlScript 信息:从类路径资源[test ddl.SQL]执行SQL脚本 2012年4月10日上午10:22:44 org.springframework.jdbc.datasource.init.ResourceDatabasePopulator executeSqlScript 信息:在30毫秒内完成了从类路径资源[test ddl.SQL]执行SQL脚本的操作。 2012年4月10日上午10:22:44 org.springframework.jdbc.datasource.init.ResourceDatabasePopulator executeSqlScript 信息:从类路径资源[test data.SQL]执行SQL脚本 2012年4月10日上午10:22:44 org.springframework.jdbc.datasource.init.ResourceDatabasePopulator executeSqlScript 信息:在46毫秒内完成了从类路径资源[test data.SQL]执行SQL脚本。 2012年4月10日上午10:22:55 org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory initDatabase 信息:正在创建嵌入式数据库“myTestDB” 2012年4月10日上午10:23:08 org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory initDatabase 信息:正在创建嵌入式数据库“myTestDB”

所以它看起来像是建立了数据库,运行了我的创建表和填充表
最初是脚本,然后在我重新初始化
\u db
之后的任何时候,脚本都不会再次运行。因此,后续测试方法不存在表。因此,如果我能找到一种方法来强制Spring每次都重新运行这些脚本,我就可以使用
@Before
@After
的实例方法来设置和拆卸方法。

@BeforeClass
static
!我将测试类更改为具有以下设置和拆卸方法:

private static EmbeddedDatabase _db;
private static LocationService _svc;

@BeforeClass
public static void setUp() throws Exception {
    _db = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.HSQL)
        .setName("myTestDB").build();
    assertThat(_db, is(notNullValue()));
    _svc = new LocationService();
    _svc.setDataSource(_db);
}

@AfterClass
public static void tearDown() throws Exception {
    _db.shutdown();
}
现在,我的
ItemService
LocationService
测试都通过了,即使在类中还有其他测试。我之前遇到的“语句中找不到表”错误在每次测试设置之前与设置之前的反应中似乎有点奇怪…

就是答案。我从test-context.xml中删除了初始化脚本,因此我的
jdbc:embedded database
标记如下所示:

<jdbc:embedded-database
    id="myTestDB"
    type="HSQL" />

我的
setUp
tearDown
方法仍然是实例方法,分别用
@Before
@Before
注释。使用调试器,我看到每个测试的控制台输出都表明我的两个初始化SQL脚本已运行,因此每个测试都有相应的表。

能否向我们展示执行查询的代码?(jUnit测试和服务类代码)