我使用SpringBoot邮件组件来生成eml文件。当我使用mockito来模拟时,为什么会生成一个真实的文件?
这是我的小样
@Resource
private JavaMailSender javaMailSender;
public File createEml(String filename) throws IOException, MessagingException {
File file = new File(filename);
try(FileOutputStream fos = new FileOutputStream(file)) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
mimeMessage.writeTo(fos);
}
return file;
}
}
试验,测验
@InjectMocks
private EmailManager emailManager = new EmailManager();
@Mock
private JavaMailSender javaMailSender;
@BeforeEach
private void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
void testCreateEml() throws MessagingException, IOException {
MimeMessage mimeMessage = Mockito.mock(MimeMessage.class);
Mockito.doNothing().when(mimeMessage).writeTo(Mockito.any(FileOutputStream.class));
Mockito.when(javaMailSender.createMimeMessage()).thenReturn(mimeMessage);
emailManager.createEml("test.eml");
}
1条答案
按热度按时间zysjyyx41#
因为您不创建
EmailManager
的mock通常@InjectMocks
注解用于您要测试的类(在本例中为EmailManager
)这是您不想模拟的真实代码(编写测试mock的测试没有意义)-您总是想测试真实代码,而mock只是一个“模拟”依赖项行为的辅助工具所以在
EmailManager
中,createEml
方法是真实的--创建文件就是它所做的--你已经发布了它的源代码。这段代码在测试过程中被执行。就是这样。因此,如果你想创建一个不创建任何真实文件的测试,你应该重构文件创建部分,使其支持内存中“虚拟”文件的文件创建。毕竟,不是任何随意编写的代码片段都可以自动进行单元测试,你必须考虑到“单元测试能力”来设计代码