Merge pull request #8140 from smatvienko-tb/fix/Test_mail_service_replaced_with_MockBean_to_fix_the_app_lifecycle
[3.5] Test mail service replaced with MockBean to fix the app lifecycle
This commit is contained in:
commit
ceaefe5fde
@ -36,7 +36,10 @@ import org.junit.rules.TestRule;
|
|||||||
import org.junit.rules.TestWatcher;
|
import org.junit.rules.TestWatcher;
|
||||||
import org.junit.runner.Description;
|
import org.junit.runner.Description;
|
||||||
import org.mockito.Mockito;
|
import org.mockito.Mockito;
|
||||||
|
import org.mockito.invocation.InvocationOnMock;
|
||||||
|
import org.mockito.stubbing.Answer;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.mock.mockito.SpyBean;
|
||||||
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.HttpHeaders;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.converter.HttpMessageConverter;
|
import org.springframework.http.converter.HttpMessageConverter;
|
||||||
@ -52,6 +55,9 @@ import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilde
|
|||||||
import org.springframework.util.LinkedMultiValueMap;
|
import org.springframework.util.LinkedMultiValueMap;
|
||||||
import org.springframework.util.MultiValueMap;
|
import org.springframework.util.MultiValueMap;
|
||||||
import org.springframework.web.context.WebApplicationContext;
|
import org.springframework.web.context.WebApplicationContext;
|
||||||
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
|
import org.thingsboard.rule.engine.api.MailService;
|
||||||
|
import org.thingsboard.rule.engine.api.util.TbNodeUtils;
|
||||||
import org.thingsboard.server.common.data.Customer;
|
import org.thingsboard.server.common.data.Customer;
|
||||||
import org.thingsboard.server.common.data.DeviceProfile;
|
import org.thingsboard.server.common.data.DeviceProfile;
|
||||||
import org.thingsboard.server.common.data.DeviceProfileType;
|
import org.thingsboard.server.common.data.DeviceProfileType;
|
||||||
@ -69,6 +75,7 @@ import org.thingsboard.server.common.data.device.profile.MqttTopics;
|
|||||||
import org.thingsboard.server.common.data.device.profile.ProtoTransportPayloadConfiguration;
|
import org.thingsboard.server.common.data.device.profile.ProtoTransportPayloadConfiguration;
|
||||||
import org.thingsboard.server.common.data.device.profile.TransportPayloadTypeConfiguration;
|
import org.thingsboard.server.common.data.device.profile.TransportPayloadTypeConfiguration;
|
||||||
import org.thingsboard.server.common.data.edge.Edge;
|
import org.thingsboard.server.common.data.edge.Edge;
|
||||||
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
import org.thingsboard.server.common.data.id.CustomerId;
|
import org.thingsboard.server.common.data.id.CustomerId;
|
||||||
import org.thingsboard.server.common.data.id.EntityId;
|
import org.thingsboard.server.common.data.id.EntityId;
|
||||||
import org.thingsboard.server.common.data.id.HasId;
|
import org.thingsboard.server.common.data.id.HasId;
|
||||||
@ -83,7 +90,6 @@ import org.thingsboard.server.common.data.security.Authority;
|
|||||||
import org.thingsboard.server.config.ThingsboardSecurityConfiguration;
|
import org.thingsboard.server.config.ThingsboardSecurityConfiguration;
|
||||||
import org.thingsboard.server.dao.Dao;
|
import org.thingsboard.server.dao.Dao;
|
||||||
import org.thingsboard.server.dao.tenant.TenantProfileService;
|
import org.thingsboard.server.dao.tenant.TenantProfileService;
|
||||||
import org.thingsboard.server.service.mail.TestMailService;
|
|
||||||
import org.thingsboard.server.service.security.auth.jwt.RefreshTokenRequest;
|
import org.thingsboard.server.service.security.auth.jwt.RefreshTokenRequest;
|
||||||
import org.thingsboard.server.service.security.auth.rest.LoginRequest;
|
import org.thingsboard.server.service.security.auth.rest.LoginRequest;
|
||||||
|
|
||||||
@ -98,6 +104,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
|
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
|
||||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch;
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch;
|
||||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
|
||||||
@ -144,6 +151,9 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
|
|||||||
|
|
||||||
protected MockMvc mockMvc;
|
protected MockMvc mockMvc;
|
||||||
|
|
||||||
|
protected String currentActivateToken;
|
||||||
|
protected String currentResetPasswordToken;
|
||||||
|
|
||||||
protected String token;
|
protected String token;
|
||||||
protected String refreshToken;
|
protected String refreshToken;
|
||||||
protected String username;
|
protected String username;
|
||||||
@ -168,6 +178,9 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private TenantProfileService tenantProfileService;
|
private TenantProfileService tenantProfileService;
|
||||||
|
|
||||||
|
@SpyBean
|
||||||
|
protected MailService mailService;
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public TestRule watcher = new TestWatcher() {
|
public TestRule watcher = new TestWatcher() {
|
||||||
protected void starting(Description description) {
|
protected void starting(Description description) {
|
||||||
@ -200,6 +213,8 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
|
|||||||
public void setupWebTest() throws Exception {
|
public void setupWebTest() throws Exception {
|
||||||
log.info("Executing web test setup");
|
log.info("Executing web test setup");
|
||||||
|
|
||||||
|
setupMailServiceMock();
|
||||||
|
|
||||||
if (this.mockMvc == null) {
|
if (this.mockMvc == null) {
|
||||||
this.mockMvc = webAppContextSetup(webApplicationContext)
|
this.mockMvc = webAppContextSetup(webApplicationContext)
|
||||||
.apply(springSecurity()).build();
|
.apply(springSecurity()).build();
|
||||||
@ -241,6 +256,27 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
|
|||||||
log.info("Executed web test setup");
|
log.info("Executed web test setup");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setupMailServiceMock() throws ThingsboardException {
|
||||||
|
Mockito.doNothing().when(mailService).sendAccountActivatedEmail(anyString(), anyString());
|
||||||
|
Mockito.doAnswer(new Answer<Void>() {
|
||||||
|
public Void answer(InvocationOnMock invocation) {
|
||||||
|
Object[] args = invocation.getArguments();
|
||||||
|
String activationLink = (String) args[0];
|
||||||
|
currentActivateToken = activationLink.split("=")[1];
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}).when(mailService).sendActivationEmail(anyString(), anyString());
|
||||||
|
|
||||||
|
Mockito.doAnswer(new Answer<Void>() {
|
||||||
|
public Void answer(InvocationOnMock invocation) {
|
||||||
|
Object[] args = invocation.getArguments();
|
||||||
|
String passwordResetLink = (String) args[0];
|
||||||
|
currentResetPasswordToken = passwordResetLink.split("=")[1];
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}).when(mailService).sendResetPasswordEmailAsync(anyString(), anyString());
|
||||||
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void teardownWebTest() throws Exception {
|
public void teardownWebTest() throws Exception {
|
||||||
log.info("Executing web test teardown");
|
log.info("Executing web test teardown");
|
||||||
@ -368,11 +404,11 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private JsonNode getActivateRequest(String password) throws Exception {
|
private JsonNode getActivateRequest(String password) throws Exception {
|
||||||
doGet("/api/noauth/activate?activateToken={activateToken}", TestMailService.currentActivateToken)
|
doGet("/api/noauth/activate?activateToken={activateToken}", this.currentActivateToken)
|
||||||
.andExpect(status().isSeeOther())
|
.andExpect(status().isSeeOther())
|
||||||
.andExpect(header().string(HttpHeaders.LOCATION, "/login/createPassword?activateToken=" + TestMailService.currentActivateToken));
|
.andExpect(header().string(HttpHeaders.LOCATION, "/login/createPassword?activateToken=" + this.currentActivateToken));
|
||||||
return new ObjectMapper().createObjectNode()
|
return new ObjectMapper().createObjectNode()
|
||||||
.put("activateToken", TestMailService.currentActivateToken)
|
.put("activateToken", this.currentActivateToken)
|
||||||
.put("password", password);
|
.put("password", password);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -21,12 +21,9 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.apache.commons.lang3.RandomStringUtils;
|
import org.apache.commons.lang3.RandomStringUtils;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mockito.Mockito;
|
import org.mockito.Mockito;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.thingsboard.common.util.JacksonUtil;
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
import org.thingsboard.rule.engine.api.MailService;
|
|
||||||
import org.thingsboard.server.common.data.AdminSettings;
|
import org.thingsboard.server.common.data.AdminSettings;
|
||||||
import org.thingsboard.server.common.data.security.model.JwtSettings;
|
import org.thingsboard.server.common.data.security.model.JwtSettings;
|
||||||
import org.thingsboard.server.service.mail.DefaultMailService;
|
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
@ -35,6 +32,8 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||||||
import static org.hamcrest.Matchers.containsString;
|
import static org.hamcrest.Matchers.containsString;
|
||||||
import static org.hamcrest.Matchers.is;
|
import static org.hamcrest.Matchers.is;
|
||||||
import static org.hamcrest.Matchers.notNullValue;
|
import static org.hamcrest.Matchers.notNullValue;
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
||||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
|
||||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||||
@ -43,12 +42,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
|
|||||||
public abstract class BaseAdminControllerTest extends AbstractControllerTest {
|
public abstract class BaseAdminControllerTest extends AbstractControllerTest {
|
||||||
final JwtSettings defaultJwtSettings = new JwtSettings(9000, 604800, "thingsboard.io", "thingsboardDefaultSigningKey");
|
final JwtSettings defaultJwtSettings = new JwtSettings(9000, 604800, "thingsboard.io", "thingsboardDefaultSigningKey");
|
||||||
|
|
||||||
@Autowired
|
|
||||||
MailService mailService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
DefaultMailService defaultMailService;
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFindAdminSettingsByKey() throws Exception {
|
public void testFindAdminSettingsByKey() throws Exception {
|
||||||
loginSysAdmin();
|
loginSysAdmin();
|
||||||
@ -118,10 +111,12 @@ public abstract class BaseAdminControllerTest extends AbstractControllerTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSendTestMail() throws Exception {
|
public void testSendTestMail() throws Exception {
|
||||||
|
Mockito.doNothing().when(mailService).sendTestMail(any(), anyString());
|
||||||
loginSysAdmin();
|
loginSysAdmin();
|
||||||
AdminSettings adminSettings = doGet("/api/admin/settings/mail", AdminSettings.class);
|
AdminSettings adminSettings = doGet("/api/admin/settings/mail", AdminSettings.class);
|
||||||
doPost("/api/admin/settings/testMail", adminSettings)
|
doPost("/api/admin/settings/testMail", adminSettings)
|
||||||
.andExpect(status().isOk());
|
.andExpect(status().isOk());
|
||||||
|
Mockito.verify(mailService).sendTestMail(Mockito.any(), Mockito.anyString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -137,15 +132,8 @@ public abstract class BaseAdminControllerTest extends AbstractControllerTest {
|
|||||||
|
|
||||||
adminSettings.setJsonValue(objectNode);
|
adminSettings.setJsonValue(objectNode);
|
||||||
|
|
||||||
Mockito.doAnswer((invocations) -> {
|
|
||||||
var jsonConfig = (JsonNode) invocations.getArgument(0);
|
|
||||||
var email = (String) invocations.getArgument(1);
|
|
||||||
|
|
||||||
defaultMailService.sendTestMail(jsonConfig, email);
|
|
||||||
return null;
|
|
||||||
}).when(mailService).sendTestMail(Mockito.any(), Mockito.anyString());
|
|
||||||
doPost("/api/admin/settings/testMail", adminSettings).andExpect(status().is5xxServerError());
|
doPost("/api/admin/settings/testMail", adminSettings).andExpect(status().is5xxServerError());
|
||||||
Mockito.doNothing().when(mailService).sendTestMail(Mockito.any(), Mockito.any());
|
Mockito.verify(mailService).sendTestMail(Mockito.any(), Mockito.anyString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void resetJwtSettingsToDefault() throws Exception {
|
void resetJwtSettingsToDefault() throws Exception {
|
||||||
|
|||||||
@ -44,7 +44,6 @@ import org.thingsboard.server.common.data.page.PageLink;
|
|||||||
import org.thingsboard.server.common.data.security.Authority;
|
import org.thingsboard.server.common.data.security.Authority;
|
||||||
import org.thingsboard.server.dao.exception.DataValidationException;
|
import org.thingsboard.server.dao.exception.DataValidationException;
|
||||||
import org.thingsboard.server.dao.user.UserDao;
|
import org.thingsboard.server.dao.user.UserDao;
|
||||||
import org.thingsboard.server.service.mail.TestMailService;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@ -54,6 +53,8 @@ import java.util.stream.Collectors;
|
|||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.hamcrest.Matchers.containsString;
|
import static org.hamcrest.Matchers.containsString;
|
||||||
import static org.hamcrest.Matchers.is;
|
import static org.hamcrest.Matchers.is;
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
|
||||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
|
||||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||||
@ -106,12 +107,12 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
|
|||||||
Mockito.reset(tbClusterService, auditLogService);
|
Mockito.reset(tbClusterService, auditLogService);
|
||||||
|
|
||||||
resetTokens();
|
resetTokens();
|
||||||
doGet("/api/noauth/activate?activateToken={activateToken}", TestMailService.currentActivateToken)
|
doGet("/api/noauth/activate?activateToken={activateToken}", this.currentActivateToken)
|
||||||
.andExpect(status().isSeeOther())
|
.andExpect(status().isSeeOther())
|
||||||
.andExpect(header().string(HttpHeaders.LOCATION, "/login/createPassword?activateToken=" + TestMailService.currentActivateToken));
|
.andExpect(header().string(HttpHeaders.LOCATION, "/login/createPassword?activateToken=" + this.currentActivateToken));
|
||||||
|
|
||||||
JsonNode activateRequest = new ObjectMapper().createObjectNode()
|
JsonNode activateRequest = new ObjectMapper().createObjectNode()
|
||||||
.put("activateToken", TestMailService.currentActivateToken)
|
.put("activateToken", this.currentActivateToken)
|
||||||
.put("password", "testPassword");
|
.put("password", "testPassword");
|
||||||
|
|
||||||
JsonNode tokenInfo = readResponse(doPost("/api/noauth/activate", activateRequest).andExpect(status().isOk()), JsonNode.class);
|
JsonNode tokenInfo = readResponse(doPost("/api/noauth/activate", activateRequest).andExpect(status().isOk()), JsonNode.class);
|
||||||
@ -208,17 +209,19 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
|
|||||||
doPost("/api/noauth/resetPasswordByEmail", resetPasswordByEmailRequest)
|
doPost("/api/noauth/resetPasswordByEmail", resetPasswordByEmailRequest)
|
||||||
.andExpect(status().isOk());
|
.andExpect(status().isOk());
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
doGet("/api/noauth/resetPassword?resetToken={resetToken}", TestMailService.currentResetPasswordToken)
|
doGet("/api/noauth/resetPassword?resetToken={resetToken}", this.currentResetPasswordToken)
|
||||||
.andExpect(status().isSeeOther())
|
.andExpect(status().isSeeOther())
|
||||||
.andExpect(header().string(HttpHeaders.LOCATION, "/login/resetPassword?resetToken=" + TestMailService.currentResetPasswordToken));
|
.andExpect(header().string(HttpHeaders.LOCATION, "/login/resetPassword?resetToken=" + this.currentResetPasswordToken));
|
||||||
|
|
||||||
JsonNode resetPasswordRequest = new ObjectMapper().createObjectNode()
|
JsonNode resetPasswordRequest = new ObjectMapper().createObjectNode()
|
||||||
.put("resetToken", TestMailService.currentResetPasswordToken)
|
.put("resetToken", this.currentResetPasswordToken)
|
||||||
.put("password", "testPassword2");
|
.put("password", "testPassword2");
|
||||||
|
|
||||||
|
Mockito.doNothing().when(mailService).sendPasswordWasResetEmail(anyString(), anyString());
|
||||||
JsonNode tokenInfo = readResponse(
|
JsonNode tokenInfo = readResponse(
|
||||||
doPost("/api/noauth/resetPassword", resetPasswordRequest)
|
doPost("/api/noauth/resetPassword", resetPasswordRequest)
|
||||||
.andExpect(status().isOk()), JsonNode.class);
|
.andExpect(status().isOk()), JsonNode.class);
|
||||||
|
Mockito.verify(mailService).sendPasswordWasResetEmail(anyString(), anyString());
|
||||||
validateAndSetJwtToken(tokenInfo, email);
|
validateAndSetJwtToken(tokenInfo, email);
|
||||||
|
|
||||||
doGet("/api/auth/user")
|
doGet("/api/auth/user")
|
||||||
|
|||||||
@ -1,58 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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 org.mockito.Mockito;
|
|
||||||
import org.mockito.invocation.InvocationOnMock;
|
|
||||||
import org.mockito.stubbing.Answer;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.context.annotation.Primary;
|
|
||||||
import org.springframework.context.annotation.Profile;
|
|
||||||
import org.thingsboard.rule.engine.api.MailService;
|
|
||||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
|
||||||
|
|
||||||
@Profile("test")
|
|
||||||
@Configuration
|
|
||||||
public class TestMailService {
|
|
||||||
|
|
||||||
public static String currentActivateToken;
|
|
||||||
public static String currentResetPasswordToken;
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
@Primary
|
|
||||||
public MailService mailService() throws ThingsboardException {
|
|
||||||
MailService mailService = Mockito.mock(MailService.class);
|
|
||||||
Mockito.doAnswer(new Answer<Void>() {
|
|
||||||
public Void answer(InvocationOnMock invocation) {
|
|
||||||
Object[] args = invocation.getArguments();
|
|
||||||
String activationLink = (String) args[0];
|
|
||||||
currentActivateToken = activationLink.split("=")[1];
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}).when(mailService).sendActivationEmail(Mockito.anyString(), Mockito.anyString());
|
|
||||||
Mockito.doAnswer(new Answer<Void>() {
|
|
||||||
public Void answer(InvocationOnMock invocation) {
|
|
||||||
Object[] args = invocation.getArguments();
|
|
||||||
String passwordResetLink = (String) args[0];
|
|
||||||
currentResetPasswordToken = passwordResetLink.split("=")[1];
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}).when(mailService).sendResetPasswordEmailAsync(Mockito.anyString(), Mockito.anyString());
|
|
||||||
return mailService;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Loading…
x
Reference in New Issue
Block a user