0

我正在编写应用程序,我需要模拟文件来测试它。我的代码如下:

@Test
public void testPostMail() throws Exception
{
    Emailer instance = new Emailer();
    instance.setRecipientsFromFile(new File("list.txt"));
}

问题是,我不想依赖硬盘上的文件(当然我可以制作一个内容正确的文件并在测试后删除它,但我想用 EasyMock 来做)。

我尝试导入 org.easymock.classextension.EasyMock 并使用它,但是:

1)我仍然收到错误“文件不是接口”

2) classextension.EasyMock 已弃用,所以我应该只使用 EasyMock

我不工作的 EasyMock 代码:

@Test
public void testSetReceipientsFromFile() throws Exception
{
File file = EasyMock.createMock(File.class);
FileReader in = EasyMock.createMock(FileReader.class);
BufferedReader br = EasyMock.createMock(BufferedReader.class);

EasyMock.expect(new FileReader(file)).andReturn(in);
EasyMock.expect(new BufferedReader(in)).andReturn(br);

EasyMock.expect(br.readLine()).andReturn("test@mail.com");
EasyMock.expect(br.readLine()).andReturn("test2@mail2.com");

EasyMock.replay(file, in, br);

EasyMock.verify(file, in, br);

// ...
}

编辑:我想从 EasyMock 更改为 Mockito,因为我听到了更有利的意见。

4

5 回答 5

1

在 Mockito 中,您可以这样做:

    BufferedReader br = Mockito.mock(BufferedReader.class);

    Mockito.when(br.readLine())
            .thenReturn("test@mail.com")
            .thenReturn("test2@mail2.com");

    // Alternative
    // Mockito.when(br.readLine()).thenReturn("aaa", "bbb");

    Assert.assertEquals("test@mail.com", br.readLine());
    Assert.assertEquals("test2@mail.com", br.readLine());
于 2012-04-18T17:16:01.543 回答
1

EasyMock 和 Mockito 都不支持对象的模拟构造。因此,您需要一个支持它的库,例如PowerMock或 PowerMockito。

但是,我认为这里存在设计缺陷。Emailer读取文件是否有责任?我不这么认为。

我将从Emailer负责从文件中读取收件人列表的新类中提取用于读取文件的代码。这将使Emailer更多的可测试性。如果你想测试这个新类,创建一个真实文件(使用TemporaryFolderrule)将是一个自然的选择,因为读取文件是该类的主要职责。

于 2012-04-18T16:31:15.127 回答
0

“听你的测试”。您应该创建一个包装器File并在Emailer.

于 2012-05-15T09:17:46.647 回答
0

您使用的是哪个版本的 EasyMock。在最新版本 3.1 中,是的,扩展 EasyMock 已弃用。您可以改用普通的简单模拟,这就是他们在 API 文档http://www.easymock.org/api/easymockclassextension/3.1/index.html中建议的内容。

于 2012-04-24T18:54:12.960 回答
0

从 EasyMock 3.0(当前版本为 3.2)开始,您可以模拟具体类,因此您现在不会收到此错误。

于 2014-04-02T09:04:22.530 回答