12

I'm testing a controller that returns a json response but the tests fail after the first time because the h2 database does not reset the auto increment id. Using fixtures or creating objects manually has a same problem.

@Before
public void setUp() {
    Fixtures.deleteAllModels();
    Fixtures.loadModels("data.yaml");
}

How to solve this problem?

DataNucleus
  • 15,497
  • 3
  • 32
  • 37
marsellvov
  • 131
  • 1
  • 1
  • 4

3 Answers3

26

Start your play app, fire up browser with this url (if you run play app locally):

http://localhost:9000/@db

Enter your h2 db, and type the command below and run:

ALTER TABLE <table_name> ALTER COLUMN <column_name> RESTART WITH 1

If you'd like to do this programmatically, Fixtures.executeSQL() might be useful

For more information, check http://www.h2database.com/html/grammar.html#alter_table_alter

dwi2
  • 1,066
  • 11
  • 14
5

If you are using Spring, I found this blog post which suggests using @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)

So that each test uses a new application context, thereby resetting the db increments.

Benjamin Slabbert
  • 511
  • 2
  • 9
  • 9
2

Execute an SQL-script on your table:

TRUNCATE TABLE my_table RESTART IDENTITY;
ALTER SEQUENCE my_table_id_seq RESTART WITH 1;

H2 should be of version 1.4.200 or higher.

See https://www.h2database.com/html/commands.html

Zon
  • 18,610
  • 7
  • 91
  • 99