Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 33 additions & 4 deletions docs/guides/testing-with-testentitybuilder.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,37 @@ Product product = builder.save(Product.class);
assert database.find(Product.class, product.getId()) != null;
```

### Save Multiple Entities

The `saveAll()` method persists multiple pre-built entities in a single call:

```java
Product p1 = builder.build(Product.class);
Product p2 = builder.build(Product.class);
builder.saveAll(p1, p2);

// Both are now in the database with assigned IDs:
assert p1.getId() != null;
assert p2.getId() != null;
```

This is equivalent to `database.saveAll(p1, p2)` but avoids needing a separate
`Database` reference in tests that already hold a `TestEntityBuilder`.

### Access the Underlying Database

The `database()` method returns the `Database` instance used internally by the builder.
This is useful in tests where you want a single injected object (`TestEntityBuilder`) but
still need to perform `find()`, `delete()`, or other database operations:

```java
Product saved = builder.save(Product.class);

// Use builder.database() instead of injecting a separate Database bean:
Product found = builder.database().find(Product.class, saved.getId());
assert found != null;
```

---

## Using with Dependency Injection
Expand Down Expand Up @@ -569,7 +600,6 @@ class TestConfig {
class OrderRepositoryTest {

@Autowired OrderRepository orderRepository;
@Autowired Database database;
@Autowired TestEntityBuilder builder;

@Test
Expand All @@ -583,7 +613,7 @@ class OrderRepositoryTest {
Order shipped = builder.build(Order.class);
shipped.setStatus(OrderStatus.SHIPPED);

database.saveAll(pending1, pending2, shipped);
builder.saveAll(pending1, pending2, shipped);

List<Order> pending = orderRepository.findByStatus(OrderStatus.PENDING);
assertThat(pending).hasSize(2);
Expand All @@ -606,7 +636,6 @@ class TestConfiguration {
@InjectTest
class OrderControllerTest {

@Inject Database database;
@Inject TestEntityBuilder builder;

@Test
Expand All @@ -620,7 +649,7 @@ class OrderControllerTest {
Order shipped = builder.build(Order.class);
shipped.setStatus(OrderStatus.SHIPPED);

database.saveAll(pending1, pending2, shipped);
builder.saveAll(pending1, pending2, shipped);

// ... test assertions
}
Expand Down
14 changes: 14 additions & 0 deletions ebean-test/src/main/java/io/ebean/test/TestEntityBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,20 @@ public <T> T save(Class<T> beanClass) {
return bean;
}

/**
* Save all the entity beans.
*/
public void saveAll(Object... beans) {
database.saveAll(beans);
}

/**
* Return the underlying database.
*/
public Database database() {
return database;
}

private <T> T build(Class<T> beanClass, Set<Class<?>> buildStack) {
BeanDescriptor<T> descriptor = (BeanDescriptor<T>) database.pluginApi().beanType(beanClass);
if (descriptor == null) {
Expand Down
26 changes: 26 additions & 0 deletions ebean-test/src/test/java/io/ebean/test/TestEntityBuilderTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,32 @@ void save_entityWithCascadeManyToOne_savesCascades() {
assertThat(foundMaster).isNotNull();
}

@Test
void saveAll_insertsMultipleBeans_andAllCanBeFound() {
EBasic bean1 = builder.build(EBasic.class);
EBasic bean2 = builder.build(EBasic.class);
EBasic bean3 = builder.build(EBasic.class);

builder.saveAll(bean1, bean2, bean3);

assertThat(bean1.getId()).isNotNull();
assertThat(bean2.getId()).isNotNull();
assertThat(bean3.getId()).isNotNull();

assertThat(DB.find(EBasic.class, bean1.getId())).isNotNull();
assertThat(DB.find(EBasic.class, bean2.getId())).isNotNull();
assertThat(DB.find(EBasic.class, bean3.getId())).isNotNull();
}

@Test
void database_returnsTheDatabaseInstance() {
EBasic saved = builder.save(EBasic.class);

EBasic found = builder.database().find(EBasic.class, saved.getId());
assertThat(found).isNotNull();
assertThat(found.getName()).isEqualTo(saved.getName());
}

@Test
void build_unknownClass_throwsIllegalArgumentException() {
org.assertj.core.api.Assertions.assertThatThrownBy(() -> builder.build(String.class))
Expand Down
Loading