test-ebean.properties

When you want to run all tests against H2 in memory database a simple way to do this is to add a src/test/resources/test-ebean.properties to your project. In the test-ebean.properties you can effectively override the properties of the datasource and specify to use H2.

When an EbeanServer is created automatically via Ebean.getDefaultServer() or Ebean.getServer(name) then Ebean will look for the existence of test-ebean.properties in the classpath. If found this then typically specifies to use an in memory H2 datasource.

When programmatically creating an EbeanServer using ServerConfig and EbeanServerFactory there is a method serverConfig.loadTestProperties() which will similarly look for a test-ebean.properties file if present.

@Override
public EbeanServer getObject() throws Exception {

  ServerConfig config = new ServerConfig();
  config.setName("db");
  config.loadFromProperties(properties);
  ...

  // load test-ebean.properties if present for running tests
  // typically using H2 in memory database
  config.loadTestProperties();

  // set as default and register so that Model can be
  // used if desired for save() and update() etc
  config.setDefaultServer(true);
  config.setRegister(true);

  return EbeanServerFactory.create(config);
}

Example test-ebean.properties

ebean.db.ddl.generate=true
ebean.db.ddl.run=true

datasource.db.username=sa
datasource.db.password=
datasource.db.databaseUrl=jdbc:h2:mem:tests
datasource.db.databaseDriver=org.h2.Driver

MockiEbean

MockiEbean from ebean-mocker project provides a helper object to support mocking the EbeanServer using tools like Mockito. If you like the Play/Active record style or Ebean singleton style you can add a test dependency on ebean-mocker and use MockiEbean to enable use of Mockito and similar tools. Mocking with Ebean singleton MockiEbean from ebean-mocker provides a mechanism for using a tool like Mockito and replacing the default EbeanServer instance with a mock.

...
import io.ebeaninternal.server.core.DefaultServer;
...

  @Test
  public void testWithMockito() {

    EbeanServer defaultServer = Ebean.getServer(null);
    assertTrue("is a real EbeanServer", defaultServer instanceof DefaultServer);

    Long someBeanId = Long.valueOf(47L);

    // Use Mockito to create a mock for the EbeanServer interface
    EbeanServer mock = Mockito.mock(EbeanServer.class);

    // setup some required behaviour
    when(mock.getBeanId(null)).thenReturn(someBeanId);

    // ---------------
    // 'register' the mock instance into Ebean
    // this becomes the 'default EbeanServer' until
    // mockiEbean.restoreOriginal() is called
    // ---------------
    MockiEbean mockiEbean = MockiEbean.start(mock);
    try {

      // Ebean singleton 'default server' now returns the mock instance
      EbeanServer server = Ebean.getDefaultServer();

      // always returns the someBeanId setup by Mockito
      Object beanId = server.getBeanId(null);

      assertEquals(someBeanId, beanId);

    } finally {
      // ---------------
      // restore the original defaultServer instance
      // ---------------
      mockiEbean.restoreOriginal();
    }

    EbeanServer restoredServer = Ebean.getDefaultServer();
    assertTrue("is a real EbeanServer", restoredServer instanceof DefaultServer);
  }

MockiEbean Maven dependency

<dependency>
  <groupId>io.ebean</groupId>
  <artifactId>ebean-mocker</artifactId>
  <version>11.18.1</version>
  <scope>test</scope>
</dependency>