2017-07-03 2 views
0

Ich habe einen Listener-Test, wo ich eine Nachricht in einem parallelen Thread und überprüfen Sie mit LatchCountDownAndCallRealMethodAnswer, ob alle erfolgreich verarbeitet wurden. Wenn Sie den Test alleine ausführen, funktioniert es einwandfrei. Wenn Sie jedoch alle anderen Tests zusammen ausführen, schlägt dies fehl, weil der Zähler nicht auf Null verlassen werden konnte. Der Listener hat die Nachricht jedoch normal empfangen und verarbeitet. Hat jemand irgendwelche Ideen?Assertion Fehler beim Ausführen von Test mit LatchCountDownAndCallRealMethodAnswer von RabbitMQ

My Test Klasse

@RunWith(SpringRunner.class) 
@SpringBootTest 
@RabbitListenerTest 
@ActiveProfiles("test") 
public class EventListenerTest { 

    EventListener eventListener; 

    @Autowired 
    protected RabbitListenerTestHarness harness; 

    @Autowired 
    private EventStoreRepository repository; 

    @SpyBean 
    private DomainEventPublisher publisher; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
     DomainRegister.setDomainEventPublisher(publisher); 
     eventListener = this.harness.getSpy("eventListenerId"); 
    } 

    @Test 
    public void storeEventsListenerTest() throws Exception { 

     LatchCountDownAndCallRealMethodAnswer answer = new LatchCountDownAndCallRealMethodAnswer(1); 
     doAnswer(answer).when(eventListener).storeEvents(any(BalanceReserved.class)); 

     publisher.publish(new BalanceReserved("12233", 150.0, BigDecimal.ZERO), ""); 

     assertTrue(answer.getLatch().await(10, TimeUnit.SECONDS)); 

     verify(eventListener, times(1)).storeEvents(any(BalanceReserved.class)); 
    } 

    @After 
    public void tearDown() { 
     DomainRegister.setDomainEventPublisher(null); 
     reset(eventListener); 
     repository.deleteAll(); 
    } 

} 

Fehler

java.lang.AssertionError 

Antwort

1

Wenn Sie andere Tests haben die gleiche Warteschlange verwenden, müssen Sie für jeden Test des Anwendungskontext schließen, so dass der Zuhörer-Tests gestoppt werden. Das Spring Test-Framework speichert den Anwendungskontext standardmäßig zur Wiederverwendung zwischen. Dies führt dazu, dass andere Tests Nachrichten "stehlen".

Fügen Sie zu jeder Testklasse @DirtiesContext hinzu, die @RabbitListener s verwendet, um dem Testframework mitzuteilen, dass der Kontext beendet werden soll.

+0

Auch wenn ich den Event-Editor in den anderen Tests vergesse, wird dies den Hasen diesen Test beeinflussen? –

+0

Event-Publisher * –

+0

Ich bin mir nicht sicher, was Sie mit "vergessen" meinen. Wenn Sie jedoch andere Tests verwenden, bei denen Sie einen '@ RabbitListener' verwenden, der aus der gleichen Warteschlange wie dieser verwendet wird, erhalten (wahrscheinlich) die Container dieser Tests (wahrscheinlich) die Nachricht dieses Tests. Sie sollten immer '@ DirtiesContext' zu jedem Testfall hinzufügen, der einen Listener-Container startet, sodass der Container nach dem Ende des Tests gestoppt wird. –

Verwandte Themen