Esencia:JBehave con SpringJUnit4ClassRunner para permitir la reversión de transacciones
¿Cómo puedo de auto-retroceso mi transacción de hibernación en una prueba JUnit con JBehave?
El problema parece ser que JBehave quiere el SpringAnnotatedEmbedderRunner
pero anotar una prueba como @Transactional
requiere el SpringJUnit4ClassRunner
.
He intentado encontrar alguna documentación sobre cómo implementar reversión con SpringAnnotatedEmbedderRunner
o hacer que JBehave funcione usando el SpringJUnit4ClassRunner
pero no pude ni trabajar.
¿Alguien tiene una configuración (preferiblemente simple) que ejecuta JBehave Storries con Spring e Hibernate y retrotracción automática de transacciones?
más info sobre mi configuración hasta ahora:
JBehave de Trabajo con la primavera - pero no con auto-rollback:
@RunWith(SpringAnnotatedEmbedderRunner.class)
@Configure(parameterConverters = ParameterConverters.EnumConverter.class)
@UsingEmbedder(embedder = Embedder.class, generateViewAfterStories = true, ignoreFailureInStories = false, ignoreFailureInView = false)
@UsingSpring(resources = { "file:src/main/webapp/WEB-INF/test-context.xml" })
@UsingSteps
@Transactional // << won't work
@TransactionConfiguration(...) // << won't work
// both require the SpringJUnit4ClassRunner
public class DwStoryTests extends JUnitStories {
protected List<String> storyPaths() {
String searchInDirectory = CodeLocations.codeLocationFromPath("src/test/resources").getFile();
return new StoryFinder().findPaths(searchInDirectory, Arrays.asList("**/*.story"), null);
}
}
En mis pasos de prueba que pueda @Inject
todo muy bien:
@Component
@Transactional // << won't work
public class PersonServiceSteps extends AbstractSmockServerTest {
@Inject
private DatabaseSetupHelper databaseSetupHelper;
@Inject
private PersonProvider personProvider;
@Given("a database in default state")
public void setupDatabase() throws SecurityException {
databaseSetupHelper.createTypes();
databaseSetupHelper.createPermission();
}
@When("the service $service is called with message $message")
public void callServiceWithMessage(String service, String message) {
sendRequestTo("/personService", withMessage("requestPersonSave.xml")).andExpect(noFault());
}
@Then("there should be a new person in the database")
public void assertNewPersonInDatabase() {
Assert.assertEquals("Service did not save person: ", personProvider.count(), 1);
}
(sí, los métodos databaseSetupHelper son todos transaccional)
PersonProvider es básicamente una envoltura alrededor de org.springframework.data.jpa.repository.support.SimpleJpaRepository
. Entonces, hay acceso al entityManager, pero tomar el control de las transacciones (con inicio/retroceso) no funcionó, supongo que debido a todos los @Transactional
s que se realizan bajo el capó dentro de esa clase de ayuda.
También he leído que JBehave se ejecuta en un contexto diferente? Sesión? Algo? que causa la pérdida de control sobre la transacción iniciada por la prueba? Algo bastante confuso ..
edición:
Editet lo anterior reformular el post para reflejar mi conocimiento actual y acortar todo el asunto por lo que la cuestión se hace más evidente y la configuración de menos demasiado prominente.
Hm .. Suena como algo que podría intentar. Gracias, lo verificaremos la próxima semana. Nuestras pruebas de aceptación no se ejecutarán contra la aplicación implementada, sino que la reservamos para las pruebas de extremo a extremo. Nuestras pruebas de aceptación se ejecutarán contra el modelo de dominio directamente, incluida una base de datos limpia que queremos autorrutar. – Pete