Как заставить метод ничего не делать в тесте интеграции junit? - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть почтовый сервис и контроллер, которые я хочу протестировать вместе, но я не хочу отправлять электронное письмо при запуске теста. Я попытался использовать @Autowire для отправителя почты в тестовом классе, чтобы сделать его метод doNothing , но это не удалось, так как это не фиктивно. Я не могу сделать это @Mock, так как я не вызываю метод контроллера, а делаю фактический запрос с import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; Вот классы:

public class EmailControllerTest extends AbstractMvcTest {
    private static final String CONTROLLER_URL = "/api/emails";

    @Test
    @Sql({DbScripts.EMAILS, DbScripts.IDENTITY_NUMBER_TYPES, DbScripts.SUBJECTS, DbScripts.USERS})
    public void sendVerificationCodeToEmailStandardTest() throws Exception {
        EmailWrapperDto dto = new EmailWrapperDto();
        dto.setEmail("test@gmail.com");

        MockHttpServletRequestBuilder request = put(CONTROLLER_URL + "/verify");
        request.content(getRequestBodyFromObject(dto));

        mockMvc.perform(request).andExpect(status().isOk());
    }
}
@RunWith(SpringRunner.class)
@WebAppConfiguration
@SpringBootTest(classes = EServicesWebBackendApplication.class)
@ActiveProfiles(ApplicationConstants.SPRING_PROFILE_TEST)
public abstract class AbstractMvcTest {
    @Autowired
    private WebApplicationContext webApplicationContext;

    @Autowired
    private ObjectMapper objectMapper;

    private H2TestDatabaseCleaner dbCleaner = new H2TestDatabaseCleaner();

    @Autowired
    private SessionFactory sessionFactory;

    protected MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = setupMockMvcBuilder(MockMvcBuilders.webAppContextSetup(webApplicationContext), true).build();
    }

    protected DefaultMockMvcBuilder setupMockMvcBuilder(DefaultMockMvcBuilder builder, boolean withCsrf) {
        MockHttpServletRequestBuilder mockServletRequestBuilder = MockMvcRequestBuilders.get("/");

        return builder.defaultRequest(mockServletRequestBuilder.contentType(MediaType.APPLICATION_JSON)
                .header("X-Requested-With", "XMLHttpRequest"));
    }

    protected String getRequestBodyFromObject(Object objectToConvertToJson) throws JsonProcessingException {
        return objectMapper.writeValueAsString(objectToConvertToJson);
    }

    @After
    public void teardown() {
        dbCleaner.clean(sessionFactory);
    }
}
@Service
public class EmailService {
    private static final int TWENTY_FOUR_HOURS_IN_MINUTES = 1440;

    @Autowired
    private MailSender mailSender;

    @Autowired
    private GenericRepository genericRepository;

    @Transactional
    public void sendVerificationCode(String email) {
        User user = genericRepository.findByIdOrElseThrowException(User.class, 11);
        String token = UUID.randomUUID().toString();
        VerificationToken verificationToken = new VerificationToken();
        verificationToken.setToken(token);
        verificationToken.setUser(user);
        verificationToken.setExpirationDate(calculateExpiryDate(TWENTY_FOUR_HOURS_IN_MINUTES));
        genericRepository.save(verificationToken);

        String subject = "Registration Confirmation";

        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setTo(email);
        mailMessage.setFrom("test@gmail.com");
        mailMessage.setSubject(subject);
        mailMessage.setText(token);
        mailSender.send(mailMessage);
    }

    private Date calculateExpiryDate(int expiryTimeInMinutes) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Timestamp(cal.getTime().getTime()));
        cal.add(Calendar.MINUTE, expiryTimeInMinutes);
        return new Date(cal.getTime().getTime());
    }
}

1 Ответ

0 голосов
/ 14 февраля 2020

Если вы используете функции Spring Mockito, вы можете использовать аннотацию @MockBean следующим образом:

public class EmailControllerTest extends AbstractMvcTest {
   ...

   @MockBean
   private MailSender mailSender;

   ...
}

и затем определить (необязательно, бездействие по умолчанию для mockito для заглушек метода void) doNothing action:

Mockito.doNothing().when(mailSender).send(Mockito.any(SimpleMailMessage.class));

Это может быть полезно, если вы хотите использовать ArgumentCaptor в методе mocked void:

ArgumentCaptor<SimpleMailMessage> valueCapture = ArgumentCaptor.forClass(SimpleMailMessage.class);
Mockito.doNothing().when(mailSender)
    .send(Mockito.any(SimpleMailMessage.class), valueCapture.capture());

см. Для справки: https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/mock/mockito/MockBean.html
https://www.baeldung.com/mockito-void-methods

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...