mirror of
https://github.com/google/nomulus.git
synced 2025-04-30 12:07:51 +02:00
Fix flakiness in JodaMoneyConverterTest (#421)
* Fix flakiness in JodaMoneyConverterTest JpdaMoneyConverterTest relies on Hibernate to deploy its schema. This introduces an extra jdbc connection in the middle of a test suite, and may break the connection count checks between tests made by JpaTransactionManagerRule. This change updated HibernateSchemaExporter to include Hibernate proprietary mappings in META-INF/orm.xml. This change also disabled Hibernate schema push for all tests, and enabled sql statement logging.
This commit is contained in:
parent
9a739daf55
commit
d75f1a8e95
3 changed files with 15 additions and 7 deletions
|
@ -32,6 +32,9 @@ import org.hibernate.tool.schema.TargetType;
|
||||||
|
|
||||||
/** Utility class to export DDL script for given {@link javax.persistence.Entity} classes. */
|
/** Utility class to export DDL script for given {@link javax.persistence.Entity} classes. */
|
||||||
public class HibernateSchemaExporter {
|
public class HibernateSchemaExporter {
|
||||||
|
// Hibernate proprietary mappings.
|
||||||
|
private static final String HIBERNATE_MAPPING_RESOURCES = "META-INF/orm.xml";
|
||||||
|
|
||||||
private final String jdbcUrl;
|
private final String jdbcUrl;
|
||||||
private final String username;
|
private final String username;
|
||||||
private final String password;
|
private final String password;
|
||||||
|
@ -63,6 +66,7 @@ public class HibernateSchemaExporter {
|
||||||
try (StandardServiceRegistry registry =
|
try (StandardServiceRegistry registry =
|
||||||
new StandardServiceRegistryBuilder().applySettings(settings).build()) {
|
new StandardServiceRegistryBuilder().applySettings(settings).build()) {
|
||||||
MetadataSources metadata = new MetadataSources(registry);
|
MetadataSources metadata = new MetadataSources(registry);
|
||||||
|
metadata.addResource(HIBERNATE_MAPPING_RESOURCES);
|
||||||
|
|
||||||
// Note that we need to also add all converters to the Hibernate context because
|
// Note that we need to also add all converters to the Hibernate context because
|
||||||
// the entity class may use the customized type.
|
// the entity class may use the customized type.
|
||||||
|
|
|
@ -119,6 +119,9 @@ abstract class JpaTransactionManagerRule extends ExternalResource {
|
||||||
// If there are user properties, create a new properties object with these added.
|
// If there are user properties, create a new properties object with these added.
|
||||||
ImmutableMap.Builder builder = properties.builder();
|
ImmutableMap.Builder builder = properties.builder();
|
||||||
builder.putAll(userProperties);
|
builder.putAll(userProperties);
|
||||||
|
// Forbid Hibernate push to stay consistent with flyway-based schema management.
|
||||||
|
builder.put(Environment.HBM2DDL_AUTO, "none");
|
||||||
|
builder.put(Environment.SHOW_SQL, "true");
|
||||||
properties = builder.build();
|
properties = builder.build();
|
||||||
}
|
}
|
||||||
assertNormalActiveConnection();
|
assertNormalActiveConnection();
|
||||||
|
|
|
@ -35,7 +35,6 @@ import javax.persistence.Id;
|
||||||
import javax.persistence.JoinColumn;
|
import javax.persistence.JoinColumn;
|
||||||
import javax.persistence.MapKeyColumn;
|
import javax.persistence.MapKeyColumn;
|
||||||
import javax.persistence.PostLoad;
|
import javax.persistence.PostLoad;
|
||||||
import org.hibernate.cfg.Environment;
|
|
||||||
import org.joda.money.CurrencyUnit;
|
import org.joda.money.CurrencyUnit;
|
||||||
import org.joda.money.Money;
|
import org.joda.money.Money;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
|
@ -67,7 +66,6 @@ public class JodaMoneyConverterTest {
|
||||||
public final JpaUnitTestRule jpaRule =
|
public final JpaUnitTestRule jpaRule =
|
||||||
new JpaTestRules.Builder()
|
new JpaTestRules.Builder()
|
||||||
.withEntityClass(TestEntity.class, ComplexTestEntity.class)
|
.withEntityClass(TestEntity.class, ComplexTestEntity.class)
|
||||||
.withProperty(Environment.HBM2DDL_AUTO, "update")
|
|
||||||
.buildUnitTestRule();
|
.buildUnitTestRule();
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -82,7 +80,7 @@ public class JodaMoneyConverterTest {
|
||||||
jpaTm()
|
jpaTm()
|
||||||
.getEntityManager()
|
.getEntityManager()
|
||||||
.createNativeQuery(
|
.createNativeQuery(
|
||||||
"SELECT amount, currency FROM TestEntity WHERE name = 'id'")
|
"SELECT amount, currency FROM \"TestEntity\" WHERE name = 'id'")
|
||||||
.getResultList());
|
.getResultList());
|
||||||
assertThat(result.size()).isEqualTo(1);
|
assertThat(result.size()).isEqualTo(1);
|
||||||
assertThat(Arrays.asList((Object[]) result.get(0)))
|
assertThat(Arrays.asList((Object[]) result.get(0)))
|
||||||
|
@ -113,7 +111,7 @@ public class JodaMoneyConverterTest {
|
||||||
.getEntityManager()
|
.getEntityManager()
|
||||||
.createNativeQuery(
|
.createNativeQuery(
|
||||||
"SELECT my_amount, my_currency, your_amount, your_currency FROM"
|
"SELECT my_amount, my_currency, your_amount, your_currency FROM"
|
||||||
+ " ComplexTestEntity WHERE name = 'id'")
|
+ " \"ComplexTestEntity\" WHERE name = 'id'")
|
||||||
.getResultList());
|
.getResultList());
|
||||||
assertThat(result.size()).isEqualTo(1);
|
assertThat(result.size()).isEqualTo(1);
|
||||||
assertThat(Arrays.asList((Object[]) result.get(0)))
|
assertThat(Arrays.asList((Object[]) result.get(0)))
|
||||||
|
@ -127,7 +125,7 @@ public class JodaMoneyConverterTest {
|
||||||
jpaTm()
|
jpaTm()
|
||||||
.getEntityManager()
|
.getEntityManager()
|
||||||
.createNativeQuery(
|
.createNativeQuery(
|
||||||
"SELECT map_amount, map_currency FROM MoneyMap"
|
"SELECT map_amount, map_currency FROM \"MoneyMap\""
|
||||||
+ " WHERE entity_name = 'id' AND map_key = 'dos'")
|
+ " WHERE entity_name = 'id' AND map_key = 'dos'")
|
||||||
.getResultList());
|
.getResultList());
|
||||||
ComplexTestEntity persisted =
|
ComplexTestEntity persisted =
|
||||||
|
@ -148,7 +146,9 @@ public class JodaMoneyConverterTest {
|
||||||
assertThat(persisted.moneyMap).containsExactlyEntriesIn(moneyMap);
|
assertThat(persisted.moneyMap).containsExactlyEntriesIn(moneyMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity(name = "TestEntity") // Override entity name to avoid the nested class reference.
|
// Override entity name to exclude outer-class name in table name. Not necessary if class is not
|
||||||
|
// inner class. The double quotes are added to conform to our schema generation convention.
|
||||||
|
@Entity(name = "\"TestEntity\"")
|
||||||
public static class TestEntity extends ImmutableObject {
|
public static class TestEntity extends ImmutableObject {
|
||||||
|
|
||||||
@Id String name = "id";
|
@Id String name = "id";
|
||||||
|
@ -162,7 +162,8 @@ public class JodaMoneyConverterTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity(name = "ComplexTestEntity") // Override entity name to avoid the nested class reference.
|
// See comments on the annotation for TestEntity above for reason.
|
||||||
|
@Entity(name = "\"ComplexTestEntity\"")
|
||||||
// This entity is used to test column override for embedded fields and collections.
|
// This entity is used to test column override for embedded fields and collections.
|
||||||
public static class ComplexTestEntity extends ImmutableObject {
|
public static class ComplexTestEntity extends ImmutableObject {
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue