mockito 模拟文件,但生成真实文件

yrdbyhpb  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(359)

我使用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");
}
zysjyyx4

zysjyyx41#

因为您不创建EmailManager的mock通常@InjectMocks注解用于您要测试的类(在本例中为EmailManager)这是您不想模拟的真实代码(编写测试mock的测试没有意义)-您总是想测试真实代码,而mock只是一个“模拟”依赖项行为的辅助工具
所以在EmailManager中,createEml方法是真实的--创建文件就是它所做的--你已经发布了它的源代码。这段代码在测试过程中被执行。就是这样。
因此,如果你想创建一个不创建任何真实文件的测试,你应该重构文件创建部分,使其支持内存中“虚拟”文件的文件创建。毕竟,不是任何随意编写的代码片段都可以自动进行单元测试,你必须考虑到“单元测试能力”来设计代码

相关问题