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());