HHH-5942 - Migrate to JUnit 4
This commit is contained in:
parent
819f8da9ea
commit
a4562f4da1
|
@ -35,6 +35,10 @@ import org.hibernate.service.jdbc.connections.spi.ConnectionProvider;
|
||||||
import org.hibernate.service.spi.Stoppable;
|
import org.hibernate.service.spi.Stoppable;
|
||||||
import org.hibernate.tool.hbm2ddl.SchemaExport;
|
import org.hibernate.tool.hbm2ddl.SchemaExport;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
|
||||||
|
import org.hibernate.testing.AfterClassOnce;
|
||||||
|
import org.hibernate.testing.BeforeClassOnce;
|
||||||
import org.hibernate.testing.env.ConnectionProviderBuilder;
|
import org.hibernate.testing.env.ConnectionProviderBuilder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -46,6 +50,23 @@ public class SuppliedConnectionTest extends ConnectionManagementTestCase {
|
||||||
private ConnectionProvider cp = ConnectionProviderBuilder.buildConnectionProvider();
|
private ConnectionProvider cp = ConnectionProviderBuilder.buildConnectionProvider();
|
||||||
private Connection connectionUnderTest;
|
private Connection connectionUnderTest;
|
||||||
|
|
||||||
|
@BeforeClassOnce
|
||||||
|
private void prepareConnectionProvider() {
|
||||||
|
cp = ConnectionProviderBuilder.buildConnectionProvider();
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClassOnce
|
||||||
|
private void releaseConnectionProvider() {
|
||||||
|
try {
|
||||||
|
if ( cp instanceof Stoppable ) {
|
||||||
|
( ( Stoppable ) cp ).stop();
|
||||||
|
}
|
||||||
|
cp = null;
|
||||||
|
}
|
||||||
|
catch( Throwable ignore ) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Session getSessionUnderTest() throws Throwable {
|
protected Session getSessionUnderTest() throws Throwable {
|
||||||
connectionUnderTest = cp.getConnection();
|
connectionUnderTest = cp.getConnection();
|
||||||
|
@ -131,14 +152,6 @@ public class SuppliedConnectionTest extends ConnectionManagementTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
if ( cp instanceof Stoppable ) {
|
|
||||||
( ( Stoppable ) cp ).stop();
|
|
||||||
}
|
|
||||||
cp = null;
|
|
||||||
}
|
|
||||||
catch( Throwable ignore ) {
|
|
||||||
}
|
|
||||||
super.cleanupTest();
|
super.cleanupTest();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,7 @@ public class SQLFunctionsInterSystemsTest extends BaseCoreFunctionalTestCase {
|
||||||
"legacy/AltSimple.hbm.xml",
|
"legacy/AltSimple.hbm.xml",
|
||||||
"legacy/Broken.hbm.xml",
|
"legacy/Broken.hbm.xml",
|
||||||
"legacy/Blobber.hbm.xml",
|
"legacy/Blobber.hbm.xml",
|
||||||
"dialect/cache/TestInterSystemsFunctionsClass.hbm.xml"
|
"dialect/functional/cache/TestInterSystemsFunctionsClass.hbm.xml"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2060,6 +2060,8 @@ public class ASTParserLoadingTest extends BaseCoreFunctionalTestCase {
|
||||||
|
|
||||||
txn.commit();
|
txn.commit();
|
||||||
session.close();
|
session.close();
|
||||||
|
|
||||||
|
createdAnimalIds.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -72,6 +72,8 @@ public class ReadOnlyCriteriaQueryTest extends AbstractReadOnlyTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testModifiableSessionDefaultCriteria() {
|
public void testModifiableSessionDefaultCriteria() {
|
||||||
|
clearCounts();
|
||||||
|
|
||||||
Session s = openSession();
|
Session s = openSession();
|
||||||
Transaction t = s.beginTransaction();
|
Transaction t = s.beginTransaction();
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,11 @@ public class RowIdTest extends BaseCoreFunctionalTestCase {
|
||||||
@Override
|
@Override
|
||||||
public void execute(Connection connection) throws SQLException {
|
public void execute(Connection connection) throws SQLException {
|
||||||
Statement st = connection.createStatement();
|
Statement st = connection.createStatement();
|
||||||
st.execute( "drop table Point");
|
try {
|
||||||
|
st.execute( "drop table Point");
|
||||||
|
}
|
||||||
|
catch (Exception ignored) {
|
||||||
|
}
|
||||||
st.execute("create table Point (\"x\" number(19,2) not null, \"y\" number(19,2) not null, description varchar2(255) )");
|
st.execute("create table Point (\"x\" number(19,2) not null, \"y\" number(19,2) not null, description varchar2(255) )");
|
||||||
st.close();
|
st.close();
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,10 +47,10 @@ import org.hibernate.usertype.UserType;
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class BasicTypeRegistryTest extends BaseUnitTestCase {
|
public class BasicTypeRegistryTest extends BaseUnitTestCase {
|
||||||
private final BasicTypeRegistry registry = new BasicTypeRegistry();
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testOverriding() {
|
public void testOverriding() {
|
||||||
|
BasicTypeRegistry registry = new BasicTypeRegistry();
|
||||||
|
|
||||||
BasicType type = registry.getRegisteredType( "uuid-binary" );
|
BasicType type = registry.getRegisteredType( "uuid-binary" );
|
||||||
assertSame( UUIDBinaryType.INSTANCE, type );
|
assertSame( UUIDBinaryType.INSTANCE, type );
|
||||||
type = registry.getRegisteredType( UUID.class.getName() );
|
type = registry.getRegisteredType( UUID.class.getName() );
|
||||||
|
@ -70,6 +70,8 @@ public class BasicTypeRegistryTest extends BaseUnitTestCase {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExpanding() {
|
public void testExpanding() {
|
||||||
|
BasicTypeRegistry registry = new BasicTypeRegistry();
|
||||||
|
|
||||||
BasicType type = registry.getRegisteredType( SomeNoopType.INSTANCE.getName() );
|
BasicType type = registry.getRegisteredType( SomeNoopType.INSTANCE.getName() );
|
||||||
assertNull( type );
|
assertNull( type );
|
||||||
|
|
||||||
|
@ -81,6 +83,8 @@ public class BasicTypeRegistryTest extends BaseUnitTestCase {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRegisteringUserTypes() {
|
public void testRegisteringUserTypes() {
|
||||||
|
BasicTypeRegistry registry = new BasicTypeRegistry();
|
||||||
|
|
||||||
registry.register( new TotallyIrrelevantUserType(), new String[] { "key" } );
|
registry.register( new TotallyIrrelevantUserType(), new String[] { "key" } );
|
||||||
BasicType type = registry.getRegisteredType( "key" );
|
BasicType type = registry.getRegisteredType( "key" );
|
||||||
assertNotNull( type );
|
assertNotNull( type );
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.testing.junit4;
|
||||||
|
|
||||||
|
import org.junit.runners.model.Statement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
public class AfterClassCallbackHandler extends Statement {
|
||||||
|
private final CustomRunner runner;
|
||||||
|
private final Statement wrappedStatement;
|
||||||
|
|
||||||
|
public AfterClassCallbackHandler(CustomRunner runner, Statement wrappedStatement) {
|
||||||
|
this.runner = runner;
|
||||||
|
this.wrappedStatement = wrappedStatement;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void evaluate() throws Throwable {
|
||||||
|
wrappedStatement.evaluate();
|
||||||
|
runner.getTestClassMetadata().performAfterClassCallbacks( runner.getTestInstance() );
|
||||||
|
}
|
||||||
|
}
|
|
@ -43,6 +43,7 @@ import org.hibernate.cfg.Environment;
|
||||||
import org.hibernate.cfg.Mappings;
|
import org.hibernate.cfg.Mappings;
|
||||||
import org.hibernate.dialect.Dialect;
|
import org.hibernate.dialect.Dialect;
|
||||||
import org.hibernate.engine.SessionFactoryImplementor;
|
import org.hibernate.engine.SessionFactoryImplementor;
|
||||||
|
import org.hibernate.engine.SessionImplementor;
|
||||||
import org.hibernate.internal.util.config.ConfigurationHelper;
|
import org.hibernate.internal.util.config.ConfigurationHelper;
|
||||||
import org.hibernate.jdbc.Work;
|
import org.hibernate.jdbc.Work;
|
||||||
import org.hibernate.mapping.Collection;
|
import org.hibernate.mapping.Collection;
|
||||||
|
@ -53,7 +54,6 @@ import org.hibernate.service.internal.ServiceRegistryImpl;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
|
|
||||||
import org.hibernate.testing.AfterClassOnce;
|
import org.hibernate.testing.AfterClassOnce;
|
||||||
import org.hibernate.testing.BeforeClassOnce;
|
import org.hibernate.testing.BeforeClassOnce;
|
||||||
|
@ -73,9 +73,9 @@ public abstract class BaseCoreFunctionalTestCase extends BaseUnitTestCase {
|
||||||
public static final String VALIDATE_DATA_CLEANUP = "hibernate.test.validateDataCleanup";
|
public static final String VALIDATE_DATA_CLEANUP = "hibernate.test.validateDataCleanup";
|
||||||
public static final Dialect DIALECT = Dialect.getDialect();
|
public static final Dialect DIALECT = Dialect.getDialect();
|
||||||
|
|
||||||
private static Configuration configuration;
|
private Configuration configuration;
|
||||||
private static ServiceRegistryImpl serviceRegistry;
|
private ServiceRegistryImpl serviceRegistry;
|
||||||
private static SessionFactoryImplementor sessionFactory;
|
private SessionFactoryImplementor sessionFactory;
|
||||||
|
|
||||||
private org.hibernate.classic.Session session;
|
private org.hibernate.classic.Session session;
|
||||||
|
|
||||||
|
@ -317,7 +317,7 @@ public abstract class BaseCoreFunctionalTestCase extends BaseUnitTestCase {
|
||||||
public final void afterTest() throws Exception {
|
public final void afterTest() throws Exception {
|
||||||
cleanupTest();
|
cleanupTest();
|
||||||
|
|
||||||
if ( session != null && session.isOpen() ) {
|
if ( session != null && ! ( (SessionImplementor) session ).isClosed() ) {
|
||||||
if ( session.isConnected() ) {
|
if ( session.isConnected() ) {
|
||||||
session.doWork( new RollbackWork() );
|
session.doWork( new RollbackWork() );
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,22 +28,18 @@ import javax.transaction.SystemException;
|
||||||
import org.hibernate.engine.transaction.internal.jta.JtaStatusHelper;
|
import org.hibernate.engine.transaction.internal.jta.JtaStatusHelper;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Rule;
|
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
import org.hibernate.testing.TestLogger;
|
import org.hibernate.testing.TestLogger;
|
||||||
import org.hibernate.testing.jta.TestingJtaBootstrap;
|
import org.hibernate.testing.jta.TestingJtaBootstrap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The most test adapter. Applies both the {@link CustomRunner} and {@link Processor} rule.
|
* The base unit test adapter.
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
@RunWith( CustomRunner.class )
|
@RunWith( CustomRunner.class )
|
||||||
public abstract class BaseUnitTestCase {
|
public abstract class BaseUnitTestCase {
|
||||||
@Rule
|
|
||||||
public Processor processor = new Processor();
|
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void releaseTransactions() {
|
public void releaseTransactions() {
|
||||||
if ( JtaStatusHelper.isActive( TestingJtaBootstrap.INSTANCE.getTransactionManager() ) ) {
|
if ( JtaStatusHelper.isActive( TestingJtaBootstrap.INSTANCE.getTransactionManager() ) ) {
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.testing.junit4;
|
||||||
|
|
||||||
|
import org.junit.runners.model.Statement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
public class BeforeClassCallbackHandler extends Statement {
|
||||||
|
private final CustomRunner runner;
|
||||||
|
private final Statement wrappedStatement;
|
||||||
|
|
||||||
|
public BeforeClassCallbackHandler(CustomRunner runner, Statement wrappedStatement) {
|
||||||
|
this.runner = runner;
|
||||||
|
this.wrappedStatement = wrappedStatement;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void evaluate() throws Throwable {
|
||||||
|
runner.getTestClassMetadata().performBeforeClassCallbacks( runner.getTestInstance() );
|
||||||
|
wrappedStatement.evaluate();
|
||||||
|
}
|
||||||
|
}
|
|
@ -23,6 +23,7 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.testing.junit4;
|
package org.hibernate.testing.junit4;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -32,12 +33,12 @@ import org.slf4j.LoggerFactory;
|
||||||
import org.hibernate.dialect.Dialect;
|
import org.hibernate.dialect.Dialect;
|
||||||
import org.hibernate.internal.util.StringHelper;
|
import org.hibernate.internal.util.StringHelper;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.Ignore;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.runner.manipulation.NoTestsRemainException;
|
import org.junit.runner.manipulation.NoTestsRemainException;
|
||||||
import org.junit.runners.BlockJUnit4ClassRunner;
|
import org.junit.runners.BlockJUnit4ClassRunner;
|
||||||
import org.junit.runners.model.FrameworkMethod;
|
import org.junit.runners.model.FrameworkMethod;
|
||||||
import org.junit.runners.model.InitializationError;
|
import org.junit.runners.model.InitializationError;
|
||||||
|
import org.junit.runners.model.Statement;
|
||||||
|
|
||||||
import org.hibernate.testing.DialectCheck;
|
import org.hibernate.testing.DialectCheck;
|
||||||
import org.hibernate.testing.FailureExpected;
|
import org.hibernate.testing.FailureExpected;
|
||||||
|
@ -45,7 +46,6 @@ import org.hibernate.testing.RequiresDialect;
|
||||||
import org.hibernate.testing.RequiresDialectFeature;
|
import org.hibernate.testing.RequiresDialectFeature;
|
||||||
import org.hibernate.testing.Skip;
|
import org.hibernate.testing.Skip;
|
||||||
import org.hibernate.testing.SkipForDialect;
|
import org.hibernate.testing.SkipForDialect;
|
||||||
import org.hibernate.testing.SkipLog;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Hibernate-specific {@link org.junit.runner.Runner} implementation which layers {@link ExtendedFrameworkMethod}
|
* The Hibernate-specific {@link org.junit.runner.Runner} implementation which layers {@link ExtendedFrameworkMethod}
|
||||||
|
@ -53,25 +53,75 @@ import org.hibernate.testing.SkipLog;
|
||||||
* test should be run.
|
* test should be run.
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
* @see Processor
|
|
||||||
*/
|
*/
|
||||||
public class CustomRunner extends BlockJUnit4ClassRunner {
|
public class CustomRunner extends BlockJUnit4ClassRunner {
|
||||||
private static final Logger log = LoggerFactory.getLogger( CustomRunner.class );
|
private static final Logger log = LoggerFactory.getLogger( CustomRunner.class );
|
||||||
|
|
||||||
private List<FrameworkMethod> computedTestMethods;
|
private TestClassMetadata testClassMetadata;
|
||||||
|
|
||||||
public CustomRunner(Class<?> clazz) throws InitializationError, NoTestsRemainException {
|
public CustomRunner(Class<?> clazz) throws InitializationError, NoTestsRemainException {
|
||||||
super( clazz );
|
super( clazz );
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<FrameworkMethod> getComputedTestMethods() {
|
@Override
|
||||||
return computedTestMethods;
|
protected void collectInitializationErrors(List<Throwable> errors) {
|
||||||
|
super.collectInitializationErrors( errors );
|
||||||
|
this.testClassMetadata = new TestClassMetadata( getTestClass().getJavaClass() );
|
||||||
|
testClassMetadata.validate( errors );
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getNumberOfComputedTestMethods() {
|
public TestClassMetadata getTestClassMetadata() {
|
||||||
return getComputedTestMethods().size();
|
return testClassMetadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Statement withBeforeClasses(Statement statement) {
|
||||||
|
return new BeforeClassCallbackHandler(
|
||||||
|
this,
|
||||||
|
super.withBeforeClasses( statement )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Statement withAfterClasses(Statement statement) {
|
||||||
|
return new AfterClassCallbackHandler(
|
||||||
|
this,
|
||||||
|
super.withAfterClasses( statement )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Statement methodInvoker(FrameworkMethod method, final Object test) {
|
||||||
|
final ExtendedFrameworkMethod extendedFrameworkMethod = (ExtendedFrameworkMethod) method;
|
||||||
|
|
||||||
|
|
||||||
|
final Statement invoker = super.methodInvoker( method, test );
|
||||||
|
|
||||||
|
return new TestMethodInvoker( invoker, testClassMetadata, extendedFrameworkMethod, test );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class FailureExpectedTestPassedException extends Exception {
|
||||||
|
public FailureExpectedTestPassedException(FrameworkMethod frameworkMethod) {
|
||||||
|
super( "Test marked as FailureExpected, but did not fail : " + Helper.extractTestName( frameworkMethod ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object testInstance;
|
||||||
|
|
||||||
|
protected Object getTestInstance() throws Exception {
|
||||||
|
if ( testInstance == null ) {
|
||||||
|
testInstance = super.createTest();
|
||||||
|
}
|
||||||
|
return testInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object createTest() throws Exception {
|
||||||
|
return getTestInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<FrameworkMethod> computedTestMethods;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<FrameworkMethod> computeTestMethods() {
|
protected List<FrameworkMethod> computeTestMethods() {
|
||||||
if ( computedTestMethods == null ) {
|
if ( computedTestMethods == null ) {
|
||||||
|
@ -80,67 +130,61 @@ public class CustomRunner extends BlockJUnit4ClassRunner {
|
||||||
return computedTestMethods;
|
return computedTestMethods;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Override the JUnit method in order to circumvent the validation check for no matching methods
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected void validateInstanceMethods(List<Throwable> errors) {
|
|
||||||
validatePublicVoidNoArgMethods(After.class, false, errors);
|
|
||||||
validatePublicVoidNoArgMethods(Before.class, false, errors);
|
|
||||||
validateTestMethods(errors);
|
|
||||||
|
|
||||||
computeTestMethods();
|
|
||||||
if ( !hadAnyTests ) {
|
|
||||||
errors.add( new Exception( "No runnable methods" ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean hadAnyTests;
|
|
||||||
|
|
||||||
protected List<FrameworkMethod> doComputation() {
|
protected List<FrameworkMethod> doComputation() {
|
||||||
// First, build the callback metadata for the test class...
|
|
||||||
TestClassCallbackMetadata callbackMetadata = new TestClassCallbackMetadata( getTestClass().getJavaClass() );
|
|
||||||
|
|
||||||
// Next, get all the test methods as understood by JUnit
|
// Next, get all the test methods as understood by JUnit
|
||||||
final List<FrameworkMethod> methods = super.computeTestMethods();
|
final List<FrameworkMethod> methods = super.computeTestMethods();
|
||||||
|
|
||||||
hadAnyTests = methods.size() > 0;
|
|
||||||
|
|
||||||
// Now process that full list of test methods and build our custom result
|
// Now process that full list of test methods and build our custom result
|
||||||
final List<FrameworkMethod> result = new ArrayList<FrameworkMethod>();
|
final List<FrameworkMethod> result = new ArrayList<FrameworkMethod>();
|
||||||
final boolean doValidation = Boolean.getBoolean( Helper.VALIDATE_FAILURE_EXPECTED );
|
final boolean doValidation = Boolean.getBoolean( Helper.VALIDATE_FAILURE_EXPECTED );
|
||||||
int testCount = 0;
|
int testCount = 0;
|
||||||
|
|
||||||
|
Ignore virtualIgnore;
|
||||||
|
|
||||||
for ( FrameworkMethod frameworkMethod : methods ) {
|
for ( FrameworkMethod frameworkMethod : methods ) {
|
||||||
// potentially ignore based on expected failure
|
// potentially ignore based on expected failure
|
||||||
final FailureExpected failureExpected = Helper.locateAnnotation( FailureExpected.class, frameworkMethod, getTestClass() );
|
final FailureExpected failureExpected = Helper.locateAnnotation( FailureExpected.class, frameworkMethod, getTestClass() );
|
||||||
if ( failureExpected != null && !doValidation ) {
|
if ( failureExpected != null && !doValidation ) {
|
||||||
log.info( Helper.extractIgnoreMessage( failureExpected, frameworkMethod ) );
|
virtualIgnore = new IgnoreImpl( Helper.extractIgnoreMessage( failureExpected, frameworkMethod ) );
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
// see if the test should be run based on skip/requires annotations
|
virtualIgnore = convertSkipToIgnore( frameworkMethod );
|
||||||
final SkipMarker skipMarker = getSkipInfoIfSkipped( frameworkMethod );
|
|
||||||
if ( skipMarker != null ) {
|
|
||||||
SkipLog.reportSkip( skipMarker );
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
testCount++;
|
testCount++;
|
||||||
log.trace( "adding test " + Helper.extractTestName( frameworkMethod ) + " [#" + testCount + "]" );
|
log.trace( "adding test " + Helper.extractTestName( frameworkMethod ) + " [#" + testCount + "]" );
|
||||||
result.add( new ExtendedFrameworkMethod( frameworkMethod, testCount, skipMarker, failureExpected, callbackMetadata, this ) );
|
result.add( new ExtendedFrameworkMethod( frameworkMethod, virtualIgnore, failureExpected ) );
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings( {"ClassExplicitlyAnnotation"})
|
||||||
|
public static class IgnoreImpl implements Ignore {
|
||||||
|
private final String value;
|
||||||
|
|
||||||
|
public IgnoreImpl(String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String value() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<? extends Annotation> annotationType() {
|
||||||
|
return Ignore.class;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static Dialect dialect = Dialect.getDialect();
|
private static Dialect dialect = Dialect.getDialect();
|
||||||
|
|
||||||
protected SkipMarker getSkipInfoIfSkipped(FrameworkMethod frameworkMethod) {
|
protected Ignore convertSkipToIgnore(FrameworkMethod frameworkMethod) {
|
||||||
// @Skip
|
// @Skip
|
||||||
Skip skip = Helper.locateAnnotation( Skip.class, frameworkMethod, getTestClass() );
|
Skip skip = Helper.locateAnnotation( Skip.class, frameworkMethod, getTestClass() );
|
||||||
if ( skip != null ) {
|
if ( skip != null ) {
|
||||||
if ( isMatch( skip.condition() ) ) {
|
if ( isMatch( skip.condition() ) ) {
|
||||||
return buildSkipMarker( skip, frameworkMethod );
|
return buildIgnore( skip );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,12 +194,12 @@ public class CustomRunner extends BlockJUnit4ClassRunner {
|
||||||
for ( Class<? extends Dialect> dialectClass : skipForDialectAnn.value() ) {
|
for ( Class<? extends Dialect> dialectClass : skipForDialectAnn.value() ) {
|
||||||
if ( skipForDialectAnn.strictMatching() ) {
|
if ( skipForDialectAnn.strictMatching() ) {
|
||||||
if ( dialectClass.equals( dialect.getClass() ) ) {
|
if ( dialectClass.equals( dialect.getClass() ) ) {
|
||||||
return buildSkipMarker( skipForDialectAnn, frameworkMethod );
|
return buildIgnore( skipForDialectAnn );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ( dialectClass.isInstance( dialect ) ) {
|
if ( dialectClass.isInstance( dialect ) ) {
|
||||||
return buildSkipMarker( skipForDialectAnn, frameworkMethod );
|
return buildIgnore( skipForDialectAnn );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -174,7 +218,7 @@ public class CustomRunner extends BlockJUnit4ClassRunner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( !foundMatch ) {
|
if ( !foundMatch ) {
|
||||||
return buildSkipMarker( requiresDialectAnn, frameworkMethod );
|
return buildIgnore( requiresDialectAnn );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,7 +229,7 @@ public class CustomRunner extends BlockJUnit4ClassRunner {
|
||||||
try {
|
try {
|
||||||
DialectCheck check = checkClass.newInstance();
|
DialectCheck check = checkClass.newInstance();
|
||||||
if ( !check.isMatch( dialect ) ) {
|
if ( !check.isMatch( dialect ) ) {
|
||||||
return buildSkipMarker( requiresDialectFeatureAnn, frameworkMethod );
|
return buildIgnore( requiresDialectFeatureAnn );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (RuntimeException e) {
|
catch (RuntimeException e) {
|
||||||
|
@ -199,20 +243,15 @@ public class CustomRunner extends BlockJUnit4ClassRunner {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private SkipMarker buildSkipMarker(Skip skip, FrameworkMethod frameworkMethod) {
|
private Ignore buildIgnore(Skip skip) {
|
||||||
return new SkipMarker( Helper.extractTestName( frameworkMethod ), "@Skip : " + skip.message() );
|
return new IgnoreImpl( "@Skip : " + skip.message() );
|
||||||
}
|
}
|
||||||
|
|
||||||
private SkipMarker buildSkipMarker(SkipForDialect skip, FrameworkMethod frameworkMethod) {
|
private Ignore buildIgnore(SkipForDialect skip) {
|
||||||
return buildSkipMarker(
|
return buildIgnore( "@SkipForDialect match", skip.comment(), skip.jiraKey() );
|
||||||
frameworkMethod,
|
|
||||||
"@SkipForDialect match",
|
|
||||||
skip.comment(),
|
|
||||||
skip.jiraKey()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private SkipMarker buildSkipMarker(FrameworkMethod frameworkMethod, String reason, String comment, String jiraKey) {
|
private Ignore buildIgnore(String reason, String comment, String jiraKey) {
|
||||||
StringBuilder buffer = new StringBuilder( reason );
|
StringBuilder buffer = new StringBuilder( reason );
|
||||||
if ( StringHelper.isNotEmpty( comment ) ) {
|
if ( StringHelper.isNotEmpty( comment ) ) {
|
||||||
buffer.append( "; " ).append( comment );
|
buffer.append( "; " ).append( comment );
|
||||||
|
@ -222,25 +261,15 @@ public class CustomRunner extends BlockJUnit4ClassRunner {
|
||||||
buffer.append( " (" ).append( jiraKey ).append( ')' );
|
buffer.append( " (" ).append( jiraKey ).append( ')' );
|
||||||
}
|
}
|
||||||
|
|
||||||
return new SkipMarker( Helper.extractTestName( frameworkMethod ), buffer.toString() );
|
return new IgnoreImpl( buffer.toString() );
|
||||||
}
|
}
|
||||||
|
|
||||||
private SkipMarker buildSkipMarker(RequiresDialect requiresDialect, FrameworkMethod frameworkMethod) {
|
private Ignore buildIgnore(RequiresDialect requiresDialect) {
|
||||||
return buildSkipMarker(
|
return buildIgnore( "@RequiresDialect non-match", requiresDialect.comment(), requiresDialect.jiraKey() );
|
||||||
frameworkMethod,
|
|
||||||
"@RequiresDialect non-match",
|
|
||||||
requiresDialect.comment(),
|
|
||||||
requiresDialect.jiraKey()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private SkipMarker buildSkipMarker(RequiresDialectFeature requiresDialectFeature, FrameworkMethod frameworkMethod) {
|
private Ignore buildIgnore(RequiresDialectFeature requiresDialectFeature) {
|
||||||
return buildSkipMarker(
|
return buildIgnore( "@RequiresDialectFeature non-match", requiresDialectFeature.comment(), requiresDialectFeature.jiraKey() );
|
||||||
frameworkMethod,
|
|
||||||
"@RequiresDialectFeature non-match",
|
|
||||||
requiresDialectFeature.comment(),
|
|
||||||
requiresDialectFeature.jiraKey()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isMatch(Class<? extends Skip.Matcher> condition) {
|
private boolean isMatch(Class<? extends Skip.Matcher> condition) {
|
||||||
|
@ -258,4 +287,5 @@ public class CustomRunner extends BlockJUnit4ClassRunner {
|
||||||
super( "Unable to instantiate specified Matcher [" + matcherClass.getName(), cause );
|
super( "Unable to instantiate specified Matcher [" + matcherClass.getName(), cause );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,73 +23,37 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.testing.junit4;
|
package org.hibernate.testing.junit4;
|
||||||
|
|
||||||
import org.hibernate.testing.FailureExpected;
|
|
||||||
import org.junit.runners.model.FrameworkMethod;
|
|
||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Ignore;
|
||||||
|
import org.junit.runners.model.FrameworkMethod;
|
||||||
|
|
||||||
|
import org.hibernate.testing.FailureExpected;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines an extension to the standard JUnit {@link FrameworkMethod} information about a test method.
|
* Defines an extension to the standard JUnit {@link FrameworkMethod} information about a test method.
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class ExtendedFrameworkMethod extends FrameworkMethod {
|
public class ExtendedFrameworkMethod extends FrameworkMethod {
|
||||||
private static final Object[] NO_ARGS = new Object[0];
|
|
||||||
|
|
||||||
private final FrameworkMethod delegatee;
|
private final FrameworkMethod delegatee;
|
||||||
private final int runPosition;
|
private final Ignore virtualIgnore;
|
||||||
private final SkipMarker skipMarker;
|
private final FailureExpected failureExpectedAnnotation;
|
||||||
private final FailureExpected failureExpectedAnnotation;
|
|
||||||
private final TestClassCallbackMetadata callbackMetadata;
|
|
||||||
private final CustomRunner unitRunner;
|
|
||||||
|
|
||||||
public ExtendedFrameworkMethod(
|
public ExtendedFrameworkMethod(FrameworkMethod delegatee, Ignore virtualIgnore, FailureExpected failureExpectedAnnotation) {
|
||||||
FrameworkMethod delegatee,
|
|
||||||
int runPosition,
|
|
||||||
SkipMarker skipMarker,
|
|
||||||
FailureExpected failureExpectedAnnotation,
|
|
||||||
TestClassCallbackMetadata callbackMetadata,
|
|
||||||
CustomRunner unitRunner) {
|
|
||||||
super( delegatee.getMethod() );
|
super( delegatee.getMethod() );
|
||||||
this.delegatee = delegatee;
|
this.delegatee = delegatee;
|
||||||
this.runPosition = runPosition;
|
this.virtualIgnore = virtualIgnore;
|
||||||
this.skipMarker = skipMarker;
|
|
||||||
this.failureExpectedAnnotation = failureExpectedAnnotation;
|
this.failureExpectedAnnotation = failureExpectedAnnotation;
|
||||||
this.callbackMetadata = callbackMetadata;
|
|
||||||
this.unitRunner = unitRunner;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public CustomRunner getUnitRunner() {
|
public FailureExpected getFailureExpectedAnnotation() {
|
||||||
return unitRunner;
|
return failureExpectedAnnotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SkipMarker getSkipMarker() {
|
@Override
|
||||||
return skipMarker;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isFirstInTestClass() {
|
|
||||||
return runPosition == 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isLastInTestClass() {
|
|
||||||
return runPosition >= unitRunner.getNumberOfComputedTestMethods();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isMarkedAsFailureExpected() {
|
|
||||||
return failureExpectedAnnotation != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public FailureExpected getFailureExpectedAnnotation() {
|
|
||||||
return failureExpectedAnnotation;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TestClassCallbackMetadata getCallbackMetadata() {
|
|
||||||
return callbackMetadata;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Method getMethod() {
|
public Method getMethod() {
|
||||||
return delegatee.getMethod();
|
return delegatee.getMethod();
|
||||||
}
|
}
|
||||||
|
@ -120,6 +84,7 @@ public class ExtendedFrameworkMethod extends FrameworkMethod {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings( {"EqualsWhichDoesntCheckParameterClass"})
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
return delegatee.equals( obj );
|
return delegatee.equals( obj );
|
||||||
}
|
}
|
||||||
|
@ -140,7 +105,11 @@ public class ExtendedFrameworkMethod extends FrameworkMethod {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings( {"unchecked"})
|
||||||
public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
|
public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
|
||||||
|
if ( Ignore.class.equals( annotationType ) && virtualIgnore != null ) {
|
||||||
|
return (T) virtualIgnore;
|
||||||
|
}
|
||||||
return delegatee.getAnnotation( annotationType );
|
return delegatee.getAnnotation( annotationType );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,7 +91,7 @@ public class Helper {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String extractIgnoreMessage(FailureExpected failureExpected, FrameworkMethod frameworkMethod) {
|
public static String extractIgnoreMessage(FailureExpected failureExpected, FrameworkMethod frameworkMethod) {
|
||||||
return new StringBuilder( "Not adding test [" )
|
return new StringBuilder( "Ignoring test [" )
|
||||||
.append( Helper.extractTestName( frameworkMethod ) )
|
.append( Helper.extractTestName( frameworkMethod ) )
|
||||||
.append( "] due to @FailureExpected - " )
|
.append( "] due to @FailureExpected - " )
|
||||||
.append( extractMessage( failureExpected ) )
|
.append( extractMessage( failureExpected ) )
|
||||||
|
|
|
@ -1,118 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011, Red Hat Inc. or third-party contributors as
|
|
||||||
* indicated by the @author tags or express copyright attribution
|
|
||||||
* statements applied by the authors. All third-party contributions are
|
|
||||||
* distributed under license by Red Hat Inc.
|
|
||||||
*
|
|
||||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
|
||||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
|
||||||
* Lesser General Public License, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
||||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
|
||||||
* for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with this distribution; if not, write to:
|
|
||||||
* Free Software Foundation, Inc.
|
|
||||||
* 51 Franklin Street, Fifth Floor
|
|
||||||
* Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
package org.hibernate.testing.junit4;
|
|
||||||
|
|
||||||
import org.junit.rules.MethodRule;
|
|
||||||
import org.junit.runners.model.FrameworkMethod;
|
|
||||||
import org.junit.runners.model.Statement;
|
|
||||||
|
|
||||||
import org.hibernate.testing.FailureExpected;
|
|
||||||
import org.hibernate.testing.SkipLog;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A custom JUnit {@link MethodRule} which essentially acts as "around advice" for test method execution. Works
|
|
||||||
* in conjunction with the information collected as part of {@link CustomRunner}.
|
|
||||||
*
|
|
||||||
* @author Steve Ebersole
|
|
||||||
* @see CustomRunner
|
|
||||||
*/
|
|
||||||
public class Processor implements MethodRule {
|
|
||||||
private static final Logger log = LoggerFactory.getLogger( Processor.class );
|
|
||||||
|
|
||||||
public Statement apply(final Statement statement, final FrameworkMethod frameworkMethod, final Object target) {
|
|
||||||
log.trace( "Preparing to start test {}", Helper.extractTestName( frameworkMethod ) );
|
|
||||||
if ( ! ExtendedFrameworkMethod.class.isInstance( frameworkMethod ) ) {
|
|
||||||
throw new IllegalStateException(
|
|
||||||
"Use of " + getClass().getName() + " only supported in combination with use of "
|
|
||||||
+ CustomRunner.class.getName()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
final ExtendedFrameworkMethod extendedFrameworkMethod = (ExtendedFrameworkMethod) frameworkMethod;
|
|
||||||
|
|
||||||
final SkipMarker skipMarker = extendedFrameworkMethod.getSkipMarker();
|
|
||||||
if ( skipMarker != null ) {
|
|
||||||
SkipLog.reportSkip( skipMarker );
|
|
||||||
return new Statement() {
|
|
||||||
@Override
|
|
||||||
public void evaluate() throws Throwable {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
final FailureExpected failureExpected = extendedFrameworkMethod.getFailureExpectedAnnotation();
|
|
||||||
|
|
||||||
return new Statement() {
|
|
||||||
@Override
|
|
||||||
public void evaluate() throws Throwable {
|
|
||||||
if ( extendedFrameworkMethod.isFirstInTestClass() ) {
|
|
||||||
extendedFrameworkMethod.getCallbackMetadata().performBeforeClassCallbacks( target );
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.evaluate();
|
|
||||||
// reaching here is expected, unless the test is marked as an expected failure
|
|
||||||
if ( failureExpected != null ) {
|
|
||||||
throw new FailureExpectedTestPassedException( extendedFrameworkMethod );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch ( FailureExpectedTestPassedException e ) {
|
|
||||||
// just pass this along
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
catch ( Throwable e ) {
|
|
||||||
// on error handling is very different based on whether the test was marked as an expected failure
|
|
||||||
if ( failureExpected != null ) {
|
|
||||||
// handle the expected failure case
|
|
||||||
log.info(
|
|
||||||
"Ignoring expected failure [{}] : {}",
|
|
||||||
Helper.extractTestName( frameworkMethod ),
|
|
||||||
Helper.extractMessage( failureExpected )
|
|
||||||
);
|
|
||||||
extendedFrameworkMethod.getCallbackMetadata().performOnExpectedFailureCallback( target );
|
|
||||||
// most importantly, do not propagate exception...
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// handle the non-expected failure case
|
|
||||||
extendedFrameworkMethod.getCallbackMetadata().performOnFailureCallback( target );
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if ( extendedFrameworkMethod.isLastInTestClass() ) {
|
|
||||||
extendedFrameworkMethod.getCallbackMetadata().performAfterClassCallbacks( target );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class FailureExpectedTestPassedException extends Exception {
|
|
||||||
public FailureExpectedTestPassedException(FrameworkMethod frameworkMethod) {
|
|
||||||
super( "Test marked as FailureExpected, but did not fail : " + Helper.extractTestName( frameworkMethod ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -32,13 +32,14 @@ import java.lang.annotation.Annotation;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Metadata about various types of callback methods on a given test class.
|
* Metadata about various types of callback methods on a given test class.
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class TestClassCallbackMetadata {
|
public class TestClassMetadata {
|
||||||
private static final Object[] NO_ARGS = new Object[0];
|
private static final Object[] NO_ARGS = new Object[0];
|
||||||
|
|
||||||
private LinkedHashSet<Method> beforeClassOnceMethods;
|
private LinkedHashSet<Method> beforeClassOnceMethods;
|
||||||
|
@ -46,7 +47,7 @@ public class TestClassCallbackMetadata {
|
||||||
private LinkedHashSet<Method> onFailureCallbacks;
|
private LinkedHashSet<Method> onFailureCallbacks;
|
||||||
private LinkedHashSet<Method> onExpectedFailureCallbacks;
|
private LinkedHashSet<Method> onExpectedFailureCallbacks;
|
||||||
|
|
||||||
public TestClassCallbackMetadata(Class testClass) {
|
public TestClassMetadata(Class testClass) {
|
||||||
processClassHierarchy( testClass );
|
processClassHierarchy( testClass );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,6 +74,87 @@ public class TestClassCallbackMetadata {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addBeforeClassOnceCallback(Method method) {
|
||||||
|
if ( beforeClassOnceMethods == null ) {
|
||||||
|
beforeClassOnceMethods = new LinkedHashSet<Method>();
|
||||||
|
}
|
||||||
|
ensureAccessibility( method );
|
||||||
|
beforeClassOnceMethods.add( method );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ensureAccessibility(Method method) {
|
||||||
|
if ( !method.isAccessible() ) {
|
||||||
|
try {
|
||||||
|
method.setAccessible( true );
|
||||||
|
}
|
||||||
|
catch (Exception ignored) {
|
||||||
|
// ignore for now
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addAfterClassOnceCallback(Method method) {
|
||||||
|
if ( afterClassOnceMethods == null ) {
|
||||||
|
afterClassOnceMethods = new LinkedHashSet<Method>();
|
||||||
|
}
|
||||||
|
ensureAccessibility( method );
|
||||||
|
afterClassOnceMethods.add( method );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addOnFailureCallback(Method method) {
|
||||||
|
if ( onFailureCallbacks == null ) {
|
||||||
|
onFailureCallbacks = new LinkedHashSet<Method>();
|
||||||
|
}
|
||||||
|
ensureAccessibility( method );
|
||||||
|
onFailureCallbacks.add( method );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addOnExpectedFailureCallback(Method method) {
|
||||||
|
if ( onExpectedFailureCallbacks == null ) {
|
||||||
|
onExpectedFailureCallbacks = new LinkedHashSet<Method>();
|
||||||
|
}
|
||||||
|
ensureAccessibility( method );
|
||||||
|
onExpectedFailureCallbacks.add( method );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void validate(List<Throwable> errors) {
|
||||||
|
validate( beforeClassOnceMethods, CallbackType.BEFORE_CLASS_ONCE, errors );
|
||||||
|
validate( afterClassOnceMethods,CallbackType.AFTER_CLASS_ONCE, errors );
|
||||||
|
validate( onFailureCallbacks, CallbackType.ON_FAILURE, errors );
|
||||||
|
validate( onExpectedFailureCallbacks, CallbackType.ON_EXPECTED_FAILURE, errors );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validate(LinkedHashSet<Method> callbackMethods, CallbackType callbackType, List<Throwable> errors) {
|
||||||
|
if ( callbackMethods != null ) {
|
||||||
|
for ( Method method : callbackMethods ) {
|
||||||
|
validateCallbackMethod( method, callbackType, errors );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateCallbackMethod(Method method, CallbackType type, List<Throwable> errors) {
|
||||||
|
if ( method.getParameterTypes().length > 0 ) {
|
||||||
|
errors.add(
|
||||||
|
new InvalidMethodForAnnotationException(
|
||||||
|
type.buildTypeMarker() + " callback only valid on no-arg methods : "
|
||||||
|
+ Helper.extractMethodName( method )
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if ( !method.isAccessible() ) {
|
||||||
|
try {
|
||||||
|
method.setAccessible( true );
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
errors.add(
|
||||||
|
new InvalidMethodForAnnotationException(
|
||||||
|
type.buildTypeMarker() + " attached to inaccessible method and unable to make accessible"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static enum CallbackType {
|
private static enum CallbackType {
|
||||||
BEFORE_CLASS_ONCE( BeforeClassOnce.class ),
|
BEFORE_CLASS_ONCE( BeforeClassOnce.class ),
|
||||||
AFTER_CLASS_ONCE( AfterClassOnce.class ),
|
AFTER_CLASS_ONCE( AfterClassOnce.class ),
|
||||||
|
@ -94,49 +176,6 @@ public class TestClassCallbackMetadata {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addBeforeClassOnceCallback(Method method) {
|
|
||||||
validateCallbackMethod( method, CallbackType.BEFORE_CLASS_ONCE );
|
|
||||||
beforeClassOnceMethods = new LinkedHashSet<Method>();
|
|
||||||
beforeClassOnceMethods.add( method );
|
|
||||||
}
|
|
||||||
|
|
||||||
private void validateCallbackMethod(Method method, CallbackType type) {
|
|
||||||
if ( method.getParameterTypes().length > 0 ) {
|
|
||||||
throw new InvalidMethodForAnnotationException(
|
|
||||||
type.buildTypeMarker() + " callback only valid on no-arg methods : "
|
|
||||||
+ Helper.extractMethodName( method )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if ( !method.isAccessible() ) {
|
|
||||||
try {
|
|
||||||
method.setAccessible( true );
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
throw new InvalidMethodForAnnotationException(
|
|
||||||
type.buildTypeMarker() + " attached to inaccessible method and unable to make accessible"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addAfterClassOnceCallback(Method method) {
|
|
||||||
validateCallbackMethod( method, TestClassCallbackMetadata.CallbackType.AFTER_CLASS_ONCE );
|
|
||||||
afterClassOnceMethods = new LinkedHashSet<Method>();
|
|
||||||
afterClassOnceMethods.add( method );
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addOnFailureCallback(Method method) {
|
|
||||||
validateCallbackMethod( method, TestClassCallbackMetadata.CallbackType.ON_FAILURE );
|
|
||||||
onFailureCallbacks = new LinkedHashSet<Method>();
|
|
||||||
onFailureCallbacks.add( method );
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addOnExpectedFailureCallback(Method method) {
|
|
||||||
validateCallbackMethod( method, TestClassCallbackMetadata.CallbackType.ON_EXPECTED_FAILURE );
|
|
||||||
onExpectedFailureCallbacks = new LinkedHashSet<Method>();
|
|
||||||
onExpectedFailureCallbacks.add( method );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void performBeforeClassCallbacks(Object target) {
|
public void performBeforeClassCallbacks(Object target) {
|
||||||
performCallbacks( beforeClassOnceMethods, target );
|
performCallbacks( beforeClassOnceMethods, target );
|
|
@ -0,0 +1,84 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.testing.junit4;
|
||||||
|
|
||||||
|
import org.junit.runners.model.Statement;
|
||||||
|
|
||||||
|
import org.hibernate.testing.FailureExpected;
|
||||||
|
import org.hibernate.testing.TestLogger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
class TestMethodInvoker extends Statement {
|
||||||
|
private final TestClassMetadata testClassMetadata;
|
||||||
|
private final ExtendedFrameworkMethod extendedFrameworkMethod;
|
||||||
|
private final Statement realInvoker;
|
||||||
|
private final Object testInstance;
|
||||||
|
|
||||||
|
public TestMethodInvoker(
|
||||||
|
Statement realInvoker,
|
||||||
|
TestClassMetadata testClassMetadata,
|
||||||
|
ExtendedFrameworkMethod extendedFrameworkMethod,
|
||||||
|
Object testInstance) {
|
||||||
|
this.realInvoker = realInvoker;
|
||||||
|
this.testClassMetadata = testClassMetadata;
|
||||||
|
this.extendedFrameworkMethod = extendedFrameworkMethod;
|
||||||
|
this.testInstance = testInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void evaluate() throws Throwable {
|
||||||
|
final FailureExpected failureExpected = extendedFrameworkMethod.getFailureExpectedAnnotation();
|
||||||
|
try {
|
||||||
|
realInvoker.evaluate();
|
||||||
|
// reaching here is expected, unless the test is marked as an expected failure
|
||||||
|
if ( failureExpected != null ) {
|
||||||
|
throw new CustomRunner.FailureExpectedTestPassedException( extendedFrameworkMethod );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (CustomRunner.FailureExpectedTestPassedException e) {
|
||||||
|
// just pass this along
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
catch (Throwable e) {
|
||||||
|
// on error handling is very different based on whether the test was marked as an expected failure
|
||||||
|
if ( failureExpected != null ) {
|
||||||
|
// handle the expected failure case
|
||||||
|
TestLogger.LOG.infof(
|
||||||
|
"Ignoring expected failure [{}] : {}",
|
||||||
|
Helper.extractTestName( extendedFrameworkMethod ),
|
||||||
|
Helper.extractMessage( failureExpected )
|
||||||
|
);
|
||||||
|
testClassMetadata.performOnExpectedFailureCallback( testInstance );
|
||||||
|
// most importantly, do not propagate exception...
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// handle the non-expected failure case
|
||||||
|
testClassMetadata.performOnFailureCallback( testInstance );
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue