H2不会在Junit Test上逐个检测到

时间:2018-02-01 17:25:58

标签: java sql junit group-by h2

我做了一个java项目,并且第一次使用H2来测试我的程序。 我正在使用H2来运行我的Junit&黄瓜试验。

我有一个查询从几个表中获取数据。

SELECT film.TITLE, film.DIRECTOR, cinema.LOCATION, cinema.THEATER_NAME, SUM(income.NUMBER_VIEW) 
FROM DRFGIRF7B_OPE.MOVIE as film
INNER JOIN DRFGIRF7B_OPE.MOVIE_THEATER as income ON film.FILM_ID = income.FILM_ID 
INNER JOIN DRFGIRF7B_OPE.THEATER as cinema ON income.THEATER_ID = cinema.THEATER_ID 
WHERE film.COUNTRY_COD = 'FRA'
GROUP BY film.TITLE, film.DIRECTOR, cinema.LOCATION;

在这里," cinema.THEATER_NAME"缺少GROUP BY语句。 当我在SQL IDE中执行此查询时,我有此错误消息(这是预期的):

SQL Failed : Selected non-aggregate values must be part of the assiociated group

但是当我用Junit运行我的测试时,H2没有检测到这个问题,并且我的所有测试都通过了,而查询被调用。

Test Class

Query

Results of Test

你有一个想法,为什么我的测试没有失败?

2 个答案:

答案 0 :(得分:1)

不同的数据库供应商采取不同的做法。例如,MySQL and SQLite决定违反规范和大多数其他数据库,并在select使用group by时允许使用任何列(将使用其中一个值)。

H2并没有记录它违反标准并基于error message

  

当在表达式列表或组或聚合查询的order by子句中使用列时,抛出代码90016的错误,并且该列不在GROUP BY子句中。

您的查询不应被允许,您的测试应该失败。

然而实际发生的情况是,当查询只返回一个不在group by H2中的列的值时,它允许它:

create table test(a int, b int);

insert into test values(1,1);
insert into test values(1,1);

select a,b from test group by a; -- output 1,1

当有多个值时,它会失败。

insert into test values(1,1);
insert into test values(1,2);

select a,b from test group by a; -- Error: Column "B" must be in the GROUP BY list

这看起来像一个错误,应该报告(如果没有其他人愿意,我可能会在不久的将来自己做。)

您遇到的问题是一个完美的例子,说明为什么使用不同的数据库进行测试和制作是一个糟糕的想法。

答案 1 :(得分:0)

您使用的数据库可能对这些查询的限制性更强。

如果您想在测试中更接近现实,请尝试像下面这样配置H2连接:

http://www.h2database.com/html/tutorial.html#using_hibernate