Java 如何使一个方法在junit集成测试中无所作为?

Java 如何使一个方法在junit集成测试中无所作为?,java,spring,junit,integration-testing,spring-boot-test,Java,Spring,Junit,Integration Testing,Spring Boot Test,我有一个邮件服务和控制器,我想一起测试,但我不想在测试运行时发送电子邮件。我尝试在测试类中的邮件发送者上使用@Autowire,使其方法不执行任何操作,但失败了,因为它不是模拟的。我不能真正将它变成一个@Mock,因为我没有调用控制器方法,而是使用import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put发出实际请求以下是类: public class EmailControllerT

我有一个邮件服务和控制器,我想一起测试,但我不想在测试运行时发送电子邮件。我尝试在测试类中的邮件发送者上使用
@Autowire
,使其方法不执行任何操作,但失败了,因为它不是模拟的。我不能真正将它变成一个
@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());
    }
}

如果您使用spring的Mockito功能,您应该能够像这样使用
@MockBean
注释:

公共类EmailControllerTest扩展了AbstractMVCTTest{
...
@蚕豆
私人邮件发送者;
...
}
然后定义(可选,不执行任何操作是mockito对void方法存根的默认行为)
doNothing
操作:

Mockito.doNothing().when(mailSender).send(Mockito.any(SimpleMailMessage.class));
如果要在模拟的void方法中使用
ArgumentCaptor
,这将非常有用:

ArgumentCaptor<SimpleMailMessage> valueCapture = ArgumentCaptor.forClass(SimpleMailMessage.class);
Mockito.doNothing().when(mailSender)
    .send(Mockito.any(SimpleMailMessage.class), valueCapture.capture());
ArgumentCaptor valueCapture=ArgumentCaptor.forClass(SimpleEmailMessage.class);
Mockito.doNothing().when(mailSender)
.send(Mockito.any(simpleEmailMessage.class)、valueCapture.capture());
请参阅以供参考:

所以你想模仿邮件发送者的send方法不发送电子邮件?这是正确的。它成功了,唯一的问题是我将它移动到了EmailControllerTest,因为其他继承类将不需要它,所以如果你愿意,你可以编辑它。另外(我保证这是最后一条评论:D)没有必要专门调用doNothing()方法,因为模拟对象默认情况下不使用void方法。@InsertKnowledge可能会认为添加它更具声明性。我发现使用
doNothing
而不是保留默认行为的主要用途是当您想要使用ArgumentCaptor时。
Mockito.doNothing().when(mailSender).send(Mockito.any(SimpleMailMessage.class));
ArgumentCaptor<SimpleMailMessage> valueCapture = ArgumentCaptor.forClass(SimpleMailMessage.class);
Mockito.doNothing().when(mailSender)
    .send(Mockito.any(SimpleMailMessage.class), valueCapture.capture());