}
@Test
public void testSendMessage_WithTransactionalUnitOfWork_ChannelClosedBeforeCommit() throws IOException {
TransactionManager<?> mockTransaction = new NoTransactionManager();
UnitOfWork uow = DefaultUnitOfWork.startAndGet(mockTransaction);
Connection connection = mock(Connection.class);
when(connectionFactory.createConnection()).thenReturn(connection);
Channel transactionalChannel = mock(Channel.class);
when(transactionalChannel.isOpen()).thenReturn(false);
when(connection.createChannel(true)).thenReturn(transactionalChannel);
GenericEventMessage<String> message = new GenericEventMessage<String>("Message");
when(serializer.serialize(message.getPayload(), byte[].class))
.thenReturn(new SimpleSerializedObject<byte[]>("Message".getBytes(UTF_8), byte[].class, "String", "0"));
when(serializer.serialize(message.getMetaData(), byte[].class))
.thenReturn(new SerializedMetaData<byte[]>(new byte[0], byte[].class));
testSubject.publish(message);
verify(transactionalChannel).basicPublish(eq("mockExchange"), eq("java.lang"),
eq(false), eq(false),
any(AMQP.BasicProperties.class), isA(byte[].class));
verify(transactionalChannel, never()).txCommit();
verify(transactionalChannel, never()).close();
try {
uow.commit();
fail("Expected exception");
} catch (EventPublicationFailedException e) {
assertNotNull(e.getMessage());
}
verify(transactionalChannel, never()).txCommit();