Essence:Kết hợp JBehave với SpringJUnit4ClassRunner để cho phép rollback giao dịch
Làm thế nào tôi có thể tự động rollback tôi ngủ đông giao dịch trong một JUnit Chạy thử với JBehave?
Vấn đề có vẻ là JBehave muốn SpringAnnotatedEmbedderRunner
nhưng chú thích thử nghiệm là @Transactional
yêu cầu SpringJUnit4ClassRunner
.
Tôi đã cố gắng tìm một số tài liệu về cách triển khai hoặc khôi phục bằng SpringAnnotatedEmbedderRunner
hoặc để thực hiện công việc JBehave bằng cách sử dụng SpringJUnit4ClassRunner
nhưng tôi không thể làm việc.
Có ai có thiết lập (tốt hơn là đơn giản) chạy các kho lưu trữ JBehave với Spring và Hibernate và tự động khôi phục giao dịch không?
infos thêm về thiết lập của tôi cho đến nay:
Working JBehave với mùa xuân - nhưng không phải với tính năng tự động 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);
}
}
Trong các bước thử nghiệm của tôi, tôi có thể @Inject
mọi thứ độc đáo:
@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);
}
(có, các phương thức DatabaseSetupHelper là tất cả giao dịch)
PersonProvider cơ bản là bao bọc xung quanh org.springframework.data.jpa.repository.support.SimpleJpaRepository
. Vì vậy, có quyền truy cập vào thực thểManager nhưng kiểm soát các giao dịch (với bắt đầu/rollback) đã không làm việc, tôi đoán vì tất cả các @Transactional
s được thực hiện dưới mui xe bên trong lớp trợ giúp đó.
Tôi cũng đọc rằng JBehave chạy trong một ngữ cảnh khác? Phiên? gây mất kiểm soát đối với giao dịch bắt đầu bằng thử nghiệm? Khá thứ khó hiểu ..
chỉnh sửa:
Editet trên rephrasing bài viết để phản ánh kiến thức hiện tại của tôi và rút ngắn toàn bộ điều để các câu hỏi trở nên rõ ràng hơn và các thiết lập ít obstrusive.
Hm .. Nghe có vẻ như tôi có thể thử. Cảm ơn, sẽ kiểm tra nó ra vào tuần tới. Các kiểm tra chấp nhận của chúng tôi sẽ không chạy với ứng dụng được triển khai, chúng tôi dành riêng cho các thử nghiệm từ đầu đến cuối. Kiểm tra chấp nhận của chúng tôi sẽ chạy với mô hình miền trực tiếp bao gồm cơ sở dữ liệu sạch mà chúng tôi muốn tự động trả lại. – Pete