radek wilo
radek wilo

Reputation: 73

Greenmail in Spring setup

I have problem that my GreenMail instance doesn't work properly in tests. I have an app with testcontainers and graphql tester, and everything works fine before I add GreenMail for testing.

I use this to register extension:

    @RegisterExtension
    protected static final GreenMailExtension greenMail = GreenMail.getInstance();
public class GreenMail {
    private static GreenMailExtension INSTANCE;
    private GreenMail() {
    }

    public static GreenMailExtension getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new GreenMailExtension(ServerSetupTest.SMTP_IMAP)
                    .withConfiguration(
                            GreenMailConfiguration.aConfig()
                                    .withDisabledAuthentication()
                    )
                    .withPerMethodLifecycle(false);
        }
        return INSTANCE;
    }


}

with configuration properites:

  mail:
    host: 127.0.0.1
    port: 3025
    protocol: smtp

And I got this error:

Exception in thread "smtp:127.0.0.1:3025<-/127.0.0.1:55311" java.util.ServiceConfigurationError: javax.mail.Provider: com.sun.mail.imap.IMAPProvider not a subtype
    at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:593)
    at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1244)
    at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1273)
    at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309)
    at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1393)
    at javax.mail.Session.loadProviders(Session.java:964)
    at javax.mail.Session.<init>(Session.java:254)
    at javax.mail.Session.getDefaultInstance(Session.java:355)
    at javax.mail.Session.getDefaultInstance(Session.java:395)
    at com.icegreen.greenmail.util.GreenMailUtil.newMimeMessage(GreenMailUtil.java:64)
    at com.icegreen.greenmail.util.GreenMailUtil.newMimeMessage(GreenMailUtil.java:74)
    at com.icegreen.greenmail.mail.MovingMessage.readDotTerminatedContent(MovingMessage.java:87)
    at com.icegreen.greenmail.smtp.commands.DataCommand.execute(DataCommand.java:54)
    at com.icegreen.greenmail.smtp.SmtpHandler.handleCommand(SmtpHandler.java:103)
    at com.icegreen.greenmail.smtp.SmtpHandler.run(SmtpHandler.java:53)
    at com.icegreen.greenmail.server.AbstractServer$1.run(AbstractServer.java:156)
    at java.base/java.lang.Thread.run(Thread.java:1589)

so I add IMAP to Greenmail Extension instance:

new GreenMailExtension(ServerSetupTest.SMTP_IMAP)

and I got that errors:


Bad return type
Exception Details:
  Location:
    com/icegreen/greenmail/imap/ImapServer.createStore()Ljavax/mail/Store; @12: areturn
  Reason:
    Type 'com/sun/mail/imap/IMAPStore' (current frame, stack[0]) is not assignable to 'javax/mail/Store' (from method signature)
  Current Frame:
    bci: @12
    flags: { }
    locals: { 'com/icegreen/greenmail/imap/ImapServer', '[Z' }
    stack: { 'com/sun/mail/imap/IMAPStore' }
  Bytecode:
    0000000: b800 384c 2ab6 0009 2b06 0454 b0       

java.lang.VerifyError: Bad return type
Exception Details:
  Location:
    com/icegreen/greenmail/imap/ImapServer.createStore()Ljavax/mail/Store; @12: areturn
  Reason:
    Type 'com/sun/mail/imap/IMAPStore' (current frame, stack[0]) is not assignable to 'javax/mail/Store' (from method signature)
  Current Frame:
    bci: @12
    flags: { }
    locals: { 'com/icegreen/greenmail/imap/ImapServer', '[Z' }
    stack: { 'com/sun/mail/imap/IMAPStore' }
  Bytecode:
    0000000: b800 384c 2ab6 0009 2b06 0454 b0       

    at com.icegreen.greenmail.util.GreenMail.createServices(GreenMail.java:150)
    at com.icegreen.greenmail.util.GreenMail.init(GreenMail.java:74)
    at com.icegreen.greenmail.util.GreenMail.<init>(GreenMail.java:63)
    at com.icegreen.greenmail.junit5.GreenMailExtension.beforeAll(GreenMailExtension.java:71)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeBeforeAllCallbacks$10(ClassBasedTestDescriptor.java:381)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeBeforeAllCallbacks(ClassBasedTestDescriptor.java:381)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:205)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:80)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:148)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:147)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:127)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:90)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:55)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:102)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:54)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
    at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:110)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:90)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:85)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:62)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
    at jdk.proxy2/jdk.proxy2.$Proxy5.stop(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60)
    at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
    at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:113)
    at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:65)
    at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
    at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
    Suppressed: java.lang.NullPointerException: Cannot invoke "com.icegreen.greenmail.util.GreenMail.stop()" because the return value of "com.icegreen.greenmail.util.GreenMailProxy.getGreenMail()" is null
        at com.icegreen.greenmail.util.GreenMailProxy.stop(GreenMailProxy.java:102)
        at com.icegreen.greenmail.junit5.GreenMailExtension.afterAll(GreenMailExtension.java:79)
        at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeAfterAllCallbacks$16(ClassBasedTestDescriptor.java:447)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeAfterAllCallbacks$17(ClassBasedTestDescriptor.java:447)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
        at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeAfterAllCallbacks(ClassBasedTestDescriptor.java:447)
        at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.after(ClassBasedTestDescriptor.java:229)
        at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.after(ClassBasedTestDescriptor.java:80)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:161)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:161)
        ... 47 more

any ideas what could I correct?

Full class for context:

@SpringBootTest
@AutoConfigureGraphQlTester
@ActiveProfiles("test")
@Testcontainers
public abstract class AbstractIntegrationTest {
    /**
     * Containers
     */
    @Container
    private static final PostgresContainer postgresContainer = PostgresContainer.getInstance();

    @Container
    private static final RedisContainer redisContainer = RedisContainer.getInstance();

    @Container
    private static final RabbitMQContainer rabbitMQContainer = RabbitMQContainer.getInstance();

    @RegisterExtension
    protected static final GreenMailExtension greenMail = GreenMail.getInstance();

    @BeforeAll
    static void beforeAll() {
        Locale.setDefault(Locale.ROOT);
        Locale.setDefault(Locale.Category.DISPLAY, Locale.ROOT);
        System.setProperty("spring.profiles.active", "test");
        greenMail.start();
    }

    @BeforeEach
    public void setup() {
        ...
        greenMail.reset();
    }
}

Upvotes: 3

Views: 763

Answers (0)

Related Questions