|
|
|
|
@@ -17,6 +17,7 @@ package org.springframework.integration.mail;
|
|
|
|
|
|
|
|
|
|
import static org.junit.Assert.assertEquals;
|
|
|
|
|
import static org.junit.Assert.assertNotNull;
|
|
|
|
|
import static org.junit.Assert.assertSame;
|
|
|
|
|
import static org.mockito.Mockito.doAnswer;
|
|
|
|
|
import static org.mockito.Mockito.mock;
|
|
|
|
|
import static org.mockito.Mockito.spy;
|
|
|
|
|
@@ -24,14 +25,19 @@ import static org.mockito.Mockito.times;
|
|
|
|
|
import static org.mockito.Mockito.verify;
|
|
|
|
|
import static org.mockito.Mockito.when;
|
|
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.io.OutputStream;
|
|
|
|
|
import java.lang.reflect.Field;
|
|
|
|
|
import java.util.Properties;
|
|
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
|
|
|
|
|
|
import javax.mail.BodyPart;
|
|
|
|
|
import javax.mail.Flags;
|
|
|
|
|
import javax.mail.Flags.Flag;
|
|
|
|
|
import javax.mail.Folder;
|
|
|
|
|
import javax.mail.Message;
|
|
|
|
|
import javax.mail.Multipart;
|
|
|
|
|
import javax.mail.Store;
|
|
|
|
|
import javax.mail.URLName;
|
|
|
|
|
import javax.mail.internet.MimeMessage;
|
|
|
|
|
@@ -42,10 +48,10 @@ import org.junit.Test;
|
|
|
|
|
import org.mockito.Mockito;
|
|
|
|
|
import org.mockito.invocation.InvocationOnMock;
|
|
|
|
|
import org.mockito.stubbing.Answer;
|
|
|
|
|
|
|
|
|
|
import org.springframework.beans.DirectFieldAccessor;
|
|
|
|
|
import org.springframework.context.ApplicationContext;
|
|
|
|
|
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
|
|
|
|
import org.springframework.core.io.ClassPathResource;
|
|
|
|
|
import org.springframework.integration.channel.DirectChannel;
|
|
|
|
|
import org.springframework.integration.channel.QueueChannel;
|
|
|
|
|
import org.springframework.integration.core.PollableChannel;
|
|
|
|
|
@@ -53,8 +59,10 @@ import org.springframework.integration.handler.AbstractReplyProducingMessageHand
|
|
|
|
|
import org.springframework.integration.history.MessageHistory;
|
|
|
|
|
import org.springframework.integration.mail.config.ImapIdleChannelAdapterParserTests;
|
|
|
|
|
import org.springframework.integration.test.util.TestUtils;
|
|
|
|
|
import org.springframework.util.FileCopyUtils;
|
|
|
|
|
|
|
|
|
|
import com.sun.mail.imap.IMAPFolder;
|
|
|
|
|
import com.sun.mail.imap.IMAPMessage;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @author Oleg Zhurakousky
|
|
|
|
|
@@ -62,9 +70,9 @@ import com.sun.mail.imap.IMAPFolder;
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
public class ImapMailReceiverTests {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private AtomicInteger failed = new AtomicInteger(0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void receiveAndMarkAsReadDontDelete() throws Exception{
|
|
|
|
|
AbstractMailReceiver receiver = new ImapMailReceiver();
|
|
|
|
|
@@ -80,7 +88,7 @@ public class ImapMailReceiverTests {
|
|
|
|
|
Message msg1 = mock(MimeMessage.class);
|
|
|
|
|
Message msg2 = mock(MimeMessage.class);
|
|
|
|
|
final Message[] messages = new Message[]{msg1, msg2};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock());
|
|
|
|
|
@@ -88,17 +96,17 @@ public class ImapMailReceiverTests {
|
|
|
|
|
if (folderOpenMode != Folder.READ_WRITE){
|
|
|
|
|
throw new IllegalArgumentException("Folder had to be open in READ_WRITE mode");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).openFolder();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return messages;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).searchForNewMessages();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return null;
|
|
|
|
|
@@ -116,13 +124,13 @@ public class ImapMailReceiverTests {
|
|
|
|
|
receiver.setShouldDeleteMessages(true);
|
|
|
|
|
receiver = spy(receiver);
|
|
|
|
|
receiver.afterPropertiesSet();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Field folderField = AbstractMailReceiver.class.getDeclaredField("folder");
|
|
|
|
|
folderField.setAccessible(true);
|
|
|
|
|
Folder folder = mock(Folder.class);
|
|
|
|
|
when(folder.getPermanentFlags()).thenReturn(new Flags(Flags.Flag.USER));
|
|
|
|
|
folderField.set(receiver, folder);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Message msg1 = mock(MimeMessage.class);
|
|
|
|
|
Message msg2 = mock(MimeMessage.class);
|
|
|
|
|
final Message[] messages = new Message[]{msg1, msg2};
|
|
|
|
|
@@ -136,13 +144,13 @@ public class ImapMailReceiverTests {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).openFolder();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return messages;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).searchForNewMessages();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return null;
|
|
|
|
|
@@ -159,14 +167,14 @@ public class ImapMailReceiverTests {
|
|
|
|
|
((ImapMailReceiver)receiver).setShouldMarkMessagesAsRead(false);
|
|
|
|
|
receiver = spy(receiver);
|
|
|
|
|
receiver.afterPropertiesSet();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Field folderField = AbstractMailReceiver.class.getDeclaredField("folder");
|
|
|
|
|
folderField.setAccessible(true);
|
|
|
|
|
Folder folder = mock(Folder.class);
|
|
|
|
|
when(folder.getPermanentFlags()).thenReturn(new Flags(Flags.Flag.USER));
|
|
|
|
|
folderField.set(receiver, folder);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Message msg1 = mock(MimeMessage.class);
|
|
|
|
|
Message msg2 = mock(MimeMessage.class);
|
|
|
|
|
final Message[] messages = new Message[]{msg1, msg2};
|
|
|
|
|
@@ -175,13 +183,13 @@ public class ImapMailReceiverTests {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).openFolder();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return messages;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).searchForNewMessages();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return null;
|
|
|
|
|
@@ -199,13 +207,13 @@ public class ImapMailReceiverTests {
|
|
|
|
|
((ImapMailReceiver)receiver).setShouldMarkMessagesAsRead(false);
|
|
|
|
|
receiver = spy(receiver);
|
|
|
|
|
receiver.afterPropertiesSet();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Field folderField = AbstractMailReceiver.class.getDeclaredField("folder");
|
|
|
|
|
folderField.setAccessible(true);
|
|
|
|
|
Folder folder = mock(Folder.class);
|
|
|
|
|
when(folder.getPermanentFlags()).thenReturn(new Flags(Flags.Flag.USER));
|
|
|
|
|
folderField.set(receiver, folder);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Message msg1 = mock(MimeMessage.class);
|
|
|
|
|
Message msg2 = mock(MimeMessage.class);
|
|
|
|
|
final Message[] messages = new Message[]{msg1, msg2};
|
|
|
|
|
@@ -219,13 +227,13 @@ public class ImapMailReceiverTests {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).openFolder();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return messages;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).searchForNewMessages();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return null;
|
|
|
|
|
@@ -243,13 +251,13 @@ public class ImapMailReceiverTests {
|
|
|
|
|
AbstractMailReceiver receiver = new ImapMailReceiver();
|
|
|
|
|
receiver = spy(receiver);
|
|
|
|
|
receiver.afterPropertiesSet();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Field folderField = AbstractMailReceiver.class.getDeclaredField("folder");
|
|
|
|
|
folderField.setAccessible(true);
|
|
|
|
|
Folder folder = mock(Folder.class);
|
|
|
|
|
when(folder.getPermanentFlags()).thenReturn(new Flags(Flags.Flag.USER));
|
|
|
|
|
folderField.set(receiver, folder);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Message msg1 = mock(MimeMessage.class);
|
|
|
|
|
Message msg2 = mock(MimeMessage.class);
|
|
|
|
|
final Message[] messages = new Message[]{msg1, msg2};
|
|
|
|
|
@@ -263,13 +271,13 @@ public class ImapMailReceiverTests {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).openFolder();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return messages;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).searchForNewMessages();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return null;
|
|
|
|
|
@@ -283,22 +291,22 @@ public class ImapMailReceiverTests {
|
|
|
|
|
@Test
|
|
|
|
|
@Ignore
|
|
|
|
|
public void testMessageHistory() throws Exception{
|
|
|
|
|
ApplicationContext context =
|
|
|
|
|
ApplicationContext context =
|
|
|
|
|
new ClassPathXmlApplicationContext("ImapIdleChannelAdapterParserTests-context.xml", ImapIdleChannelAdapterParserTests.class);
|
|
|
|
|
ImapIdleChannelAdapter adapter = context.getBean("simpleAdapter", ImapIdleChannelAdapter.class);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AbstractMailReceiver receiver = new ImapMailReceiver();
|
|
|
|
|
receiver = spy(receiver);
|
|
|
|
|
receiver.afterPropertiesSet();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
|
|
|
|
|
adapterAccessor.setPropertyValue("mailReceiver", receiver);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MimeMessage mailMessage = mock(MimeMessage.class);
|
|
|
|
|
Flags flags = mock(Flags.class);
|
|
|
|
|
when(mailMessage.getFlags()).thenReturn(flags);
|
|
|
|
|
final Message[] messages = new Message[]{mailMessage};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
DirectFieldAccessor accesor = new DirectFieldAccessor((invocation.getMock()));
|
|
|
|
|
@@ -308,19 +316,19 @@ public class ImapMailReceiverTests {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).openFolder();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return messages;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).searchForNewMessages();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).fetchMessages(messages);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PollableChannel channel = context.getBean("channel", PollableChannel.class);
|
|
|
|
|
|
|
|
|
|
adapter.start();
|
|
|
|
|
@@ -334,16 +342,17 @@ public class ImapMailReceiverTests {
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testIdleChannelAdapterException() throws Exception{
|
|
|
|
|
ApplicationContext context =
|
|
|
|
|
ApplicationContext context =
|
|
|
|
|
new ClassPathXmlApplicationContext("ImapIdleChannelAdapterParserTests-context.xml", ImapIdleChannelAdapterParserTests.class);
|
|
|
|
|
ImapIdleChannelAdapter adapter = context.getBean("simpleAdapter", ImapIdleChannelAdapter.class);
|
|
|
|
|
|
|
|
|
|
//ImapMailReceiver receiver = (ImapMailReceiver) TestUtils.getPropertyValue(adapter, "mailReceiver");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DirectChannel channel = new DirectChannel();
|
|
|
|
|
channel.subscribe(new AbstractReplyProducingMessageHandler() {
|
|
|
|
|
@Override
|
|
|
|
|
protected Object handleRequestMessage(org.springframework.integration.Message<?> requestMessage) {
|
|
|
|
|
throw new RuntimeException("Failed");
|
|
|
|
|
}
|
|
|
|
|
@@ -351,58 +360,58 @@ public class ImapMailReceiverTests {
|
|
|
|
|
adapter.setOutputChannel(channel);
|
|
|
|
|
QueueChannel errorChannel = new QueueChannel();
|
|
|
|
|
adapter.setErrorChannel(errorChannel);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AbstractMailReceiver receiver = new ImapMailReceiver();
|
|
|
|
|
receiver = spy(receiver);
|
|
|
|
|
receiver.afterPropertiesSet();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Field folderField = AbstractMailReceiver.class.getDeclaredField("folder");
|
|
|
|
|
folderField.setAccessible(true);
|
|
|
|
|
Folder folder = mock(IMAPFolder.class);
|
|
|
|
|
when(folder.getPermanentFlags()).thenReturn(new Flags(Flags.Flag.USER));
|
|
|
|
|
folderField.set(receiver, folder);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}).when(folder).isOpen();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).openFolder();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
|
|
|
|
|
adapterAccessor.setPropertyValue("mailReceiver", receiver);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MimeMessage mailMessage = mock(MimeMessage.class);
|
|
|
|
|
Flags flags = mock(Flags.class);
|
|
|
|
|
when(mailMessage.getFlags()).thenReturn(flags);
|
|
|
|
|
final Message[] messages = new Message[]{mailMessage};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return messages;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).searchForNewMessages();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doAnswer(new Answer<Object>() {
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}).when(receiver).fetchMessages(messages);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
adapter.start();
|
|
|
|
|
org.springframework.integration.Message<?> replMessage = errorChannel.receive(10000);
|
|
|
|
|
assertNotNull(replMessage);
|
|
|
|
|
assertEquals("Failed", ((Exception) replMessage.getPayload()).getCause().getMessage());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test // see INT-1801
|
|
|
|
|
public void testImapLifecycleForRaceCondition() throws Exception{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < 1000; i++) {
|
|
|
|
|
final ImapMailReceiver receiver = new ImapMailReceiver("imap://foo");
|
|
|
|
|
Store store = mock(Store.class);
|
|
|
|
|
@@ -412,12 +421,12 @@ public class ImapMailReceiverTests {
|
|
|
|
|
when(folder.search((SearchTerm) Mockito.any())).thenReturn(new Message[]{});
|
|
|
|
|
when(store.getFolder(Mockito.any(URLName.class))).thenReturn(folder);
|
|
|
|
|
when(folder.getPermanentFlags()).thenReturn(new Flags(Flags.Flag.USER));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DirectFieldAccessor df = new DirectFieldAccessor(receiver);
|
|
|
|
|
df.setPropertyValue("store", store);
|
|
|
|
|
receiver.afterPropertiesSet();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
new Thread(new Runnable() {
|
|
|
|
|
public void run(){
|
|
|
|
|
try {
|
|
|
|
|
@@ -428,10 +437,10 @@ public class ImapMailReceiverTests {
|
|
|
|
|
failed.getAndIncrement();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}).start();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
new Thread(new Runnable() {
|
|
|
|
|
public void run(){
|
|
|
|
|
try {
|
|
|
|
|
@@ -445,4 +454,55 @@ public class ImapMailReceiverTests {
|
|
|
|
|
}
|
|
|
|
|
assertEquals(0, failed.get());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testAttachments() throws Exception {
|
|
|
|
|
final ImapMailReceiver receiver = new ImapMailReceiver("imap://foo");
|
|
|
|
|
Store store = mock(Store.class);
|
|
|
|
|
Folder folder = mock(Folder.class);
|
|
|
|
|
when(folder.exists()).thenReturn(true);
|
|
|
|
|
when(folder.isOpen()).thenReturn(true);
|
|
|
|
|
final AtomicBoolean closed = new AtomicBoolean();
|
|
|
|
|
doAnswer(new Answer<Object> (){
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
closed.set(true);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}).when(folder).close(Mockito.anyBoolean());
|
|
|
|
|
IMAPMessage message = mock(IMAPMessage.class);
|
|
|
|
|
when(folder.search((SearchTerm) Mockito.any())).thenReturn(new Message[]{message});
|
|
|
|
|
when(store.getFolder(Mockito.any(URLName.class))).thenReturn(folder);
|
|
|
|
|
when(folder.getPermanentFlags()).thenReturn(new Flags(Flags.Flag.USER));
|
|
|
|
|
DirectFieldAccessor df = new DirectFieldAccessor(receiver);
|
|
|
|
|
df.setPropertyValue("store", store);
|
|
|
|
|
receiver.afterPropertiesSet();
|
|
|
|
|
|
|
|
|
|
Multipart multiPart = mock(Multipart.class);
|
|
|
|
|
when(multiPart.getCount()).thenReturn(1);
|
|
|
|
|
when(message.getContent()).thenReturn(multiPart);
|
|
|
|
|
final BodyPart bodyPart = mock(BodyPart.class);
|
|
|
|
|
doAnswer(new Answer<Object>(){
|
|
|
|
|
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
if (closed.get()) {
|
|
|
|
|
throw new IOException("Folder is closed");
|
|
|
|
|
}
|
|
|
|
|
return bodyPart;
|
|
|
|
|
}
|
|
|
|
|
}).when(multiPart).getBodyPart(Mockito.anyInt());
|
|
|
|
|
when(bodyPart.getContent()).thenReturn("bar");
|
|
|
|
|
doAnswer(new Answer<Object> () {
|
|
|
|
|
|
|
|
|
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
|
|
|
|
OutputStream os = (OutputStream) invocation.getArguments()[0];
|
|
|
|
|
FileCopyUtils.copy(new ClassPathResource("test.mail").getInputStream(), os);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}).when(message).writeTo(Mockito.any(OutputStream.class));
|
|
|
|
|
Message[] messages = receiver.receive();
|
|
|
|
|
Object content = messages[0].getContent();
|
|
|
|
|
assertEquals("bar\n", ((Multipart) content).getBodyPart(0).getContent());
|
|
|
|
|
|
|
|
|
|
assertSame(folder, messages[0].getFolder());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|