मैं क्वार्ट्ज अनुसूचक पर एकीकरण परीक्षण बनाने की कोशिश करता हूं।

मेरे पास 2 टेबल हैं: ईवेंट और कार्य। क्रोन ट्रिगर द्वारा शेड्यूलर कार्य ईवेंट बनाते हैं।

@SneakyThrows
@Test
public void taskGenerationBeanTest() {
    RequestData request = requestBuilder(str(), str(), str()).build();
    String orderId = String.valueOf(UUID.randomUUID());
    Event event1 = getEvent("type1", request, orderId);
    Event event2 = getEvent("type2", request, orderId);

    eventRepository.save(event1);
    eventRepository.save(event2);

    Thread.sleep(20000);
    List<Event> events = eventRepository.findAll();
    Thread.sleep(1000);
    List<Task> actual = taskRepository.findAll();

    assertAll(
            () -> assertEquals(2, actual.size()),
            () -> assertTrue(actual.stream().anyMatch(t ->
                    "type1".equals(t.getEvent().getEventType()))),
            () -> assertEquals(event1.getOrderId(), actual.get(0).getEvent().getOrderId())
    );
}

सबसे पहले, मुझे अपवाद मिलता है:

प्रॉक्सी प्रारंभ नहीं कर सका - कोई सत्र नहीं

मैं इस उत्तर का उपयोग करता हूं स्प्रिंग डेटा जेपीए - "प्रॉक्सी प्रारंभ नहीं कर सका - कोई सत्र नहीं" - लेन-देन के रूप में चिह्नित विधियों के साथ और spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true जोड़ें मेरे परीक्षण config. तो अब मुझे एक और समस्या आती है - मेरा परीक्षण कभी-कभी सही काम करता है, लेकिन अधिक बार यह गिर जाता है, क्योंकि यह केवल 1 कार्य बनाता है।

विधि, जिसे क्वार्ट्ज द्वारा क्रियान्वित किया गया है:

@Override
@Transactional(isolation = Isolation.REPEATABLE_READ)
public int createAndSaveTasks(EventType eventType) {
    List<Task> tasks = eventService.getEvent(eventType)
            .stream()
            .map(Task::new)
            .collect(Collectors.toList());
    taskRepository.saveAll(tasks);
    return tasks.size();
}

तो क्वार्ट्स और लेनदेन के साथ एकीकरण परीक्षण कैसे ठीक से बनाएं?

0
petrov.aleksandr 21 अक्टूबर 2021, 16:21
सबसे अधिक संभावना है कि टेस्ट क्लास में लेन-देन नहीं होता है, इसलिए आपको t.getEvent () या ऑर्डरआईड () नहीं मिल सकता है
 – 
Gurkan İlleez
21 अक्टूबर 2021, 16:52
Spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true जोड़ने के बाद मैं कार्य से ईवेंट प्राप्त कर सकता हूं
 – 
petrov.aleksandr
21 अक्टूबर 2021, 16:59

1 उत्तर

सबसे बढ़िया उत्तर

टेस्ट क्लास रिपोजिटरी की खोज सभी विधि का उपयोग करता है और यदि आप LAZY प्रारंभिक विधि प्राप्त करने का प्रयास करते हैं, तो आप यह अपवाद प्राप्त कर सकते हैं।

दावों में:

t.getEvent().getEventType() // can throw it
actual.get(0).getEvent() // can throw it

इससे बचने के लिए शायद आप इसे ट्रांजेक्शनल बना सकते हैं या उत्सुक फ़ेच प्रकार को प्राथमिकता दी जा सकती है।

दोहराने योग्य पढ़ने के तहत दूसरा चयन कम से कम उन पंक्तियों को प्रदर्शित करने की गारंटी है जो पहले चयन से अपरिवर्तित थे। उस एक मिनट में समवर्ती लेन-देन द्वारा नई पंक्तियाँ जोड़ी जा सकती हैं, लेकिन मौजूदा पंक्तियों को हटाया नहीं जा सकता और न ही बदला जा सकता है।

"रीड कमिटेड" और "रिपीटेबल रीड" के बीच अंतर

1
Gurkan İlleez 21 अक्टूबर 2021, 17:05
मैं इसे उत्सुक नहीं कर सकता, क्योंकि सभी सही काम करते हैं, समस्या केवल एकीकरण परीक्षण के साथ है
 – 
petrov.aleksandr
21 अक्टूबर 2021, 17:03
1
असल में यह ISOLATION स्तर से संबंधित है और क्या आप इसे READ_COMMITED में बदल सकते हैं। दोहराने योग्य_पढ़ने पर दूसरी क्वेरी को समवर्ती तरीके से अपडेट नहीं किया जा सकता है
 – 
Gurkan İlleez
21 अक्टूबर 2021, 17:04