From bd5aae46d9bea20fd9eab7a60835b9aabc4c173d Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Thu, 17 Aug 2023 12:36:06 +0300 Subject: [PATCH 1/6] fixed testConnection method for mail sender if oauth2 enabled --- .../thingsboard/server/service/mail/TbMailSender.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java b/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java index 0a9b173247..75dea3ad6a 100644 --- a/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java +++ b/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java @@ -35,6 +35,7 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.mail.MailOauth2Provider; import org.thingsboard.server.dao.exception.IncorrectParameterException; +import javax.mail.Transport; import javax.mail.internet.MimeMessage; import java.time.Duration; import java.time.Instant; @@ -80,6 +81,16 @@ public class TbMailSender extends JavaMailSenderImpl { super.doSend(mimeMessages, originalMessages); } + @SneakyThrows + @Override + public void testConnection() { + if (oauth2Enabled && (System.currentTimeMillis() > tokenExpires)){ + refreshAccessToken(); + setPassword(accessToken); + } + super.testConnection(); + } + private Properties createJavaMailProperties(JsonNode jsonConfig) { Properties javaMailProperties = new Properties(); String protocol = jsonConfig.get("smtpProtocol").asText(); From a0228bdf45c8a2fc673dd89639610260bba8596a Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Tue, 22 Aug 2023 12:32:12 +0300 Subject: [PATCH 2/6] extracted repeated code to separate method, deleted @SneakyTrows annotation --- .../server/service/mail/TbMailSender.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java b/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java index 75dea3ad6a..6f98748dac 100644 --- a/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java +++ b/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java @@ -23,7 +23,6 @@ import com.google.api.client.auth.oauth2.TokenResponse; import com.google.api.client.http.GenericUrl; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; -import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.lang.Nullable; import org.springframework.mail.javamail.JavaMailSenderImpl; @@ -35,7 +34,7 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.mail.MailOauth2Provider; import org.thingsboard.server.dao.exception.IncorrectParameterException; -import javax.mail.Transport; +import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.time.Duration; import java.time.Instant; @@ -71,24 +70,27 @@ public class TbMailSender extends JavaMailSenderImpl { setJavaMailProperties(createJavaMailProperties(jsonConfig)); } - @SneakyThrows @Override public void doSend(MimeMessage[] mimeMessages, @Nullable Object[] originalMessages) { - if (oauth2Enabled && (System.currentTimeMillis() > tokenExpires)){ - refreshAccessToken(); - setPassword(accessToken); - } + updateOauth2PasswordIfExpired(); super.doSend(mimeMessages, originalMessages); } - @SneakyThrows @Override - public void testConnection() { + public void testConnection() throws MessagingException { + updateOauth2PasswordIfExpired(); + super.testConnection(); + } + + private void updateOauth2PasswordIfExpired() { if (oauth2Enabled && (System.currentTimeMillis() > tokenExpires)){ - refreshAccessToken(); + try { + refreshAccessToken(); + } catch (ThingsboardException e) { + throw new RuntimeException(e); + } setPassword(accessToken); } - super.testConnection(); } private Properties createJavaMailProperties(JsonNode jsonConfig) { From 3e329d5f0110bd88a71a26955a73c50140c91b8a Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Tue, 22 Aug 2023 15:57:10 +0300 Subject: [PATCH 3/6] added unit tests for TbMailSender, refactred error handling in TbMailSender --- .../server/service/mail/TbMailSender.java | 26 ++--- .../server/service/mail/TbMailSenderTest.java | 98 +++++++++++++++++++ 2 files changed, 112 insertions(+), 12 deletions(-) create mode 100644 application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java diff --git a/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java b/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java index 6f98748dac..39c547c4f2 100644 --- a/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java +++ b/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java @@ -28,8 +28,6 @@ import org.springframework.lang.Nullable; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.StringUtils; -import org.thingsboard.server.common.data.exception.ThingsboardErrorCode; -import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.mail.MailOauth2Provider; import org.thingsboard.server.dao.exception.IncorrectParameterException; @@ -71,24 +69,28 @@ public class TbMailSender extends JavaMailSenderImpl { } @Override - public void doSend(MimeMessage[] mimeMessages, @Nullable Object[] originalMessages) { + protected void doSend(MimeMessage[] mimeMessages, @Nullable Object[] originalMessages) { updateOauth2PasswordIfExpired(); + doSendSuper(mimeMessages, originalMessages); + } + + protected void doSendSuper(MimeMessage[] mimeMessages, Object[] originalMessages) { super.doSend(mimeMessages, originalMessages); } @Override public void testConnection() throws MessagingException { updateOauth2PasswordIfExpired(); + testConnectionSuper(); + } + + public void testConnectionSuper() throws MessagingException { super.testConnection(); } - private void updateOauth2PasswordIfExpired() { + public void updateOauth2PasswordIfExpired() { if (oauth2Enabled && (System.currentTimeMillis() > tokenExpires)){ - try { - refreshAccessToken(); - } catch (ThingsboardException e) { - throw new RuntimeException(e); - } + refreshAccessToken(); setPassword(accessToken); } } @@ -138,7 +140,7 @@ public class TbMailSender extends JavaMailSenderImpl { return javaMailProperties; } - public void refreshAccessToken() throws ThingsboardException { + public void refreshAccessToken() { lock.lock(); try { if (System.currentTimeMillis() > tokenExpires) { @@ -164,8 +166,8 @@ public class TbMailSender extends JavaMailSenderImpl { tokenExpires = System.currentTimeMillis() + (tokenResponse.getExpiresInSeconds().intValue() * 1000); } } catch (Exception e) { - log.warn("Unable to retrieve access token: {}", e.getMessage()); - throw new ThingsboardException("Error while retrieving access token: " + e.getMessage(), ThingsboardErrorCode.GENERAL); + log.error("Unable to retrieve access token: {}", e.getMessage()); + throw new RuntimeException("Error while retrieving access token: " + e.getMessage()); } finally { lock.unlock(); } diff --git a/application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java b/application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java new file mode 100644 index 0000000000..9beb8a4dd8 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java @@ -0,0 +1,98 @@ +package org.thingsboard.server.service.mail; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.thingsboard.common.util.JacksonUtil; +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.internet.MimeMessage; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; + +@RunWith(MockitoJUnitRunner.class) +public class TbMailSenderTest { + + @Test + public void testDoSendSendMail() { + ObjectNode jsonConfig = getBasicMailConfig(); + TbMailSender tbMailSender = spy(new TbMailSender(mock(TbMailContextComponent.class), jsonConfig)); + + MimeMessage mimeMsg = new MimeMessage(Session.getInstance(new Properties())); + List mimeMessages = new ArrayList<>(1); + mimeMessages.add(mimeMsg); + + Mockito.doNothing().when(tbMailSender).updateOauth2PasswordIfExpired(); + Mockito.doNothing().when(tbMailSender).doSendSuper(any(), any()); + + tbMailSender.doSend(mimeMessages.toArray(new MimeMessage[0]), null); + + Mockito.verify(tbMailSender, times(1)).updateOauth2PasswordIfExpired(); + } + + @Test + public void testTestConnection() throws MessagingException { + ObjectNode jsonConfig = getBasicMailConfig(); + TbMailSender tbMailSender = spy(new TbMailSender(mock(TbMailContextComponent.class), jsonConfig)); + + Mockito.doNothing().when(tbMailSender).updateOauth2PasswordIfExpired(); + Mockito.doNothing().when(tbMailSender).testConnectionSuper(); + + tbMailSender.testConnection(); + + Mockito.verify(tbMailSender, times(1)).updateOauth2PasswordIfExpired(); + } + + @Test + public void testUpdateOauth2PasswordIfExpiredIfOauth2Enabled() { + ObjectNode jsonConfig = getOauth2Config(); + TbMailSender tbMailSender = spy(new TbMailSender(mock(TbMailContextComponent.class), jsonConfig)); + + Mockito.doNothing().when(tbMailSender).refreshAccessToken(); + + tbMailSender.updateOauth2PasswordIfExpired(); + + Mockito.verify(tbMailSender, times(1)).refreshAccessToken(); + Mockito.verify(tbMailSender, times(1)).setPassword(any()); + } + + @Test + public void testUpdateOauth2PasswordIfExpiredIfOauth2Disabled() { + ObjectNode jsonConfig = getBasicMailConfig(); + TbMailSender tbMailSender = spy(new TbMailSender(mock(TbMailContextComponent.class), jsonConfig)); + + tbMailSender.updateOauth2PasswordIfExpired(); + + Mockito.verify(tbMailSender, Mockito.never()).refreshAccessToken(); + Mockito.verify(tbMailSender, Mockito.never()).setPassword(any()); + } + + private static ObjectNode getOauth2Config() { + ObjectNode jsonConfig = JacksonUtil.newObjectNode(); + jsonConfig.put("smtpProtocol", "smtps"); + jsonConfig.put("timeout", "1000"); + jsonConfig.put("enableOauth2", true); + jsonConfig.put("smtpHost", "smtp.gmail.com"); + jsonConfig.put("smtpPort", "465"); + jsonConfig.put("username", "testUser"); + return jsonConfig; + } + + private static ObjectNode getBasicMailConfig() { + ObjectNode jsonConfig = JacksonUtil.newObjectNode(); + jsonConfig.put("smtpProtocol", "smtps"); + jsonConfig.put("timeout", "1000"); + jsonConfig.put("smtpHost", "smtp.gmail.com"); + jsonConfig.put("smtpPort", "465"); + jsonConfig.put("username", "testUser"); + return jsonConfig; + } +} From 90331a5bf7e3510f4a9de79d615e29aa8059d8d8 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Tue, 22 Aug 2023 16:00:00 +0300 Subject: [PATCH 4/6] fixed license --- .../server/service/mail/TbMailSenderTest.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java b/application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java index 9beb8a4dd8..81cfea1d35 100644 --- a/application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java +++ b/application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java @@ -1,3 +1,18 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.thingsboard.server.service.mail; import com.fasterxml.jackson.databind.node.ObjectNode; From 356cbd93c34a9ed9d775a9c0d7424d06601e3962 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Tue, 22 Aug 2023 17:56:29 +0300 Subject: [PATCH 5/6] moved TbMailSenderTest to junit5, added more cases --- .../server/service/mail/TbMailSender.java | 21 +++-- .../server/service/mail/TbMailSenderTest.java | 89 ++++++++----------- 2 files changed, 55 insertions(+), 55 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java b/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java index 39c547c4f2..3872fc4c7a 100644 --- a/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java +++ b/application/src/main/java/org/thingsboard/server/service/mail/TbMailSender.java @@ -25,6 +25,8 @@ import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import lombok.extern.slf4j.Slf4j; import org.springframework.lang.Nullable; +import org.springframework.mail.MailException; +import org.springframework.mail.MailSendException; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.StringUtils; @@ -48,6 +50,7 @@ public class TbMailSender extends JavaMailSenderImpl { private static final String MAIL_PROP = "mail."; private final TbMailContextComponent ctx; private final Lock lock; + private final Boolean oauth2Enabled; private volatile String accessToken; private volatile long tokenExpires; @@ -68,13 +71,21 @@ public class TbMailSender extends JavaMailSenderImpl { setJavaMailProperties(createJavaMailProperties(jsonConfig)); } + public Boolean getOauth2Enabled() { + return oauth2Enabled; + } + + public long getTokenExpires() { + return tokenExpires; + } + @Override - protected void doSend(MimeMessage[] mimeMessages, @Nullable Object[] originalMessages) { + protected void doSend(MimeMessage[] mimeMessages, @Nullable Object[] originalMessages) throws MailException { updateOauth2PasswordIfExpired(); doSendSuper(mimeMessages, originalMessages); } - protected void doSendSuper(MimeMessage[] mimeMessages, Object[] originalMessages) { + public void doSendSuper(MimeMessage[] mimeMessages, Object[] originalMessages) { super.doSend(mimeMessages, originalMessages); } @@ -88,8 +99,8 @@ public class TbMailSender extends JavaMailSenderImpl { super.testConnection(); } - public void updateOauth2PasswordIfExpired() { - if (oauth2Enabled && (System.currentTimeMillis() > tokenExpires)){ + public void updateOauth2PasswordIfExpired() { + if (getOauth2Enabled() && (System.currentTimeMillis() > getTokenExpires())){ refreshAccessToken(); setPassword(accessToken); } @@ -143,7 +154,7 @@ public class TbMailSender extends JavaMailSenderImpl { public void refreshAccessToken() { lock.lock(); try { - if (System.currentTimeMillis() > tokenExpires) { + if (System.currentTimeMillis() > getTokenExpires()) { AdminSettings settings = ctx.getAdminSettingsService().findAdminSettingsByKey(TenantId.SYS_TENANT_ID, "mail"); JsonNode jsonValue = settings.getJsonValue(); diff --git a/application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java b/application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java index 81cfea1d35..c0d3743161 100644 --- a/application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java +++ b/application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java @@ -15,32 +15,37 @@ */ package org.thingsboard.server.service.mail; -import com.fasterxml.jackson.databind.node.ObjectNode; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; -import org.thingsboard.common.util.JacksonUtil; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.MimeMessage; import java.util.ArrayList; import java.util.List; import java.util.Properties; +import java.util.stream.Stream; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.willCallRealMethod; +import static org.mockito.BDDMockito.willReturn; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; -@RunWith(MockitoJUnitRunner.class) public class TbMailSenderTest { + private TbMailSender tbMailSender; + + @BeforeEach + void setUp() { + tbMailSender = mock(TbMailSender.class); + } + @Test public void testDoSendSendMail() { - ObjectNode jsonConfig = getBasicMailConfig(); - TbMailSender tbMailSender = spy(new TbMailSender(mock(TbMailContextComponent.class), jsonConfig)); - MimeMessage mimeMsg = new MimeMessage(Session.getInstance(new Properties())); List mimeMessages = new ArrayList<>(1); mimeMessages.add(mimeMsg); @@ -48,66 +53,50 @@ public class TbMailSenderTest { Mockito.doNothing().when(tbMailSender).updateOauth2PasswordIfExpired(); Mockito.doNothing().when(tbMailSender).doSendSuper(any(), any()); + willCallRealMethod().given(tbMailSender).doSend(any(), any()); tbMailSender.doSend(mimeMessages.toArray(new MimeMessage[0]), null); Mockito.verify(tbMailSender, times(1)).updateOauth2PasswordIfExpired(); + Mockito.verify(tbMailSender, times(1)).doSendSuper(any(), any()); } @Test public void testTestConnection() throws MessagingException { - ObjectNode jsonConfig = getBasicMailConfig(); - TbMailSender tbMailSender = spy(new TbMailSender(mock(TbMailContextComponent.class), jsonConfig)); - Mockito.doNothing().when(tbMailSender).updateOauth2PasswordIfExpired(); Mockito.doNothing().when(tbMailSender).testConnectionSuper(); + willCallRealMethod().given(tbMailSender).testConnection(); tbMailSender.testConnection(); Mockito.verify(tbMailSender, times(1)).updateOauth2PasswordIfExpired(); + Mockito.verify(tbMailSender, times(1)).testConnectionSuper(); } - @Test - public void testUpdateOauth2PasswordIfExpiredIfOauth2Enabled() { - ObjectNode jsonConfig = getOauth2Config(); - TbMailSender tbMailSender = spy(new TbMailSender(mock(TbMailContextComponent.class), jsonConfig)); + @ParameterizedTest + @MethodSource("provideSenderConfiguration") + public void testUpdateOauth2PasswordIfExpiredIfOauth2Enabled(boolean oauth2, long expiresIn, boolean passwordUpdateNeeded) { + willReturn(oauth2).given(tbMailSender).getOauth2Enabled(); + willReturn(expiresIn).given(tbMailSender).getTokenExpires(); Mockito.doNothing().when(tbMailSender).refreshAccessToken(); - + willCallRealMethod().given(tbMailSender).updateOauth2PasswordIfExpired(); tbMailSender.updateOauth2PasswordIfExpired(); - Mockito.verify(tbMailSender, times(1)).refreshAccessToken(); - Mockito.verify(tbMailSender, times(1)).setPassword(any()); - } - - @Test - public void testUpdateOauth2PasswordIfExpiredIfOauth2Disabled() { - ObjectNode jsonConfig = getBasicMailConfig(); - TbMailSender tbMailSender = spy(new TbMailSender(mock(TbMailContextComponent.class), jsonConfig)); - - tbMailSender.updateOauth2PasswordIfExpired(); - - Mockito.verify(tbMailSender, Mockito.never()).refreshAccessToken(); - Mockito.verify(tbMailSender, Mockito.never()).setPassword(any()); - } - - private static ObjectNode getOauth2Config() { - ObjectNode jsonConfig = JacksonUtil.newObjectNode(); - jsonConfig.put("smtpProtocol", "smtps"); - jsonConfig.put("timeout", "1000"); - jsonConfig.put("enableOauth2", true); - jsonConfig.put("smtpHost", "smtp.gmail.com"); - jsonConfig.put("smtpPort", "465"); - jsonConfig.put("username", "testUser"); - return jsonConfig; + if (passwordUpdateNeeded) { + Mockito.verify(tbMailSender, times(1)).refreshAccessToken(); + Mockito.verify(tbMailSender, times(1)).setPassword(any()); + } else { + Mockito.verify(tbMailSender, Mockito.never()).refreshAccessToken(); + Mockito.verify(tbMailSender, Mockito.never()).setPassword(any()); + } } - private static ObjectNode getBasicMailConfig() { - ObjectNode jsonConfig = JacksonUtil.newObjectNode(); - jsonConfig.put("smtpProtocol", "smtps"); - jsonConfig.put("timeout", "1000"); - jsonConfig.put("smtpHost", "smtp.gmail.com"); - jsonConfig.put("smtpPort", "465"); - jsonConfig.put("username", "testUser"); - return jsonConfig; + private static Stream provideSenderConfiguration() { + return Stream.of( + Arguments.of(true, 0L, true), + Arguments.of(true, System.currentTimeMillis() + 5000, false), + Arguments.of(false, 0L, false), + Arguments.of(false, System.currentTimeMillis() + 5000, false) + ); } } From 9b8a48dc96caaf99e71d4ba7e9554ffae76b551b Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Tue, 22 Aug 2023 18:03:21 +0300 Subject: [PATCH 6/6] deleted redundant mocks --- .../thingsboard/server/service/mail/TbMailSenderTest.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java b/application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java index c0d3743161..5b95adf526 100644 --- a/application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java +++ b/application/src/test/java/org/thingsboard/server/service/mail/TbMailSenderTest.java @@ -50,9 +50,6 @@ public class TbMailSenderTest { List mimeMessages = new ArrayList<>(1); mimeMessages.add(mimeMsg); - Mockito.doNothing().when(tbMailSender).updateOauth2PasswordIfExpired(); - Mockito.doNothing().when(tbMailSender).doSendSuper(any(), any()); - willCallRealMethod().given(tbMailSender).doSend(any(), any()); tbMailSender.doSend(mimeMessages.toArray(new MimeMessage[0]), null); @@ -62,9 +59,6 @@ public class TbMailSenderTest { @Test public void testTestConnection() throws MessagingException { - Mockito.doNothing().when(tbMailSender).updateOauth2PasswordIfExpired(); - Mockito.doNothing().when(tbMailSender).testConnectionSuper(); - willCallRealMethod().given(tbMailSender).testConnection(); tbMailSender.testConnection(); @@ -78,7 +72,6 @@ public class TbMailSenderTest { willReturn(oauth2).given(tbMailSender).getOauth2Enabled(); willReturn(expiresIn).given(tbMailSender).getTokenExpires(); - Mockito.doNothing().when(tbMailSender).refreshAccessToken(); willCallRealMethod().given(tbMailSender).updateOauth2PasswordIfExpired(); tbMailSender.updateOauth2PasswordIfExpired();