我对模拟还很陌生,并且我一直在尝试模拟实际内容(本质上仅在内存中创建一个虚拟文件),以便在任何时候都不会将任何数据写入磁盘。
我尝试过模拟文件和模拟尽可能多的属性的解决方案,然后还使用文件写入器/缓冲写入器将其写入,但是这些方法不能很好地工作,因为它们需要规范路径。有人找到了除此以外的解决方案,但我正在解决这个错误?
我一直在这样做:
private void mocking(){
File badHTML = mock(File.class);
//setting the properties of badHTML
when(badHTML.canExecute()).thenReturn(Boolean.FALSE);
when(badHTML.canRead()).thenReturn(Boolean.TRUE);
when(badHTML.canWrite()).thenReturn(Boolean.TRUE);
when(badHTML.compareTo(badHTML)).thenReturn(Integer.SIZE);
when(badHTML.delete()).thenReturn(Boolean.FALSE);
when(badHTML.getFreeSpace()).thenReturn(0l);
when(badHTML.getName()).thenReturn("bad.html");
when(badHTML.getParent()).thenReturn(null);
when(badHTML.getPath()).thenReturn("bad.html");
when(badHTML.getParentFile()).thenReturn(null);
when(badHTML.getTotalSpace()).thenReturn(0l);
when(badHTML.isAbsolute()).thenReturn(Boolean.FALSE);
when(badHTML.isDirectory()).thenReturn(Boolean.FALSE);
when(badHTML.isFile()).thenReturn(Boolean.TRUE);
when(badHTML.isHidden()).thenReturn(Boolean.FALSE);
when(badHTML.lastModified()).thenReturn(System.currentTimeMillis());
when(badHTML.mkdir()).thenReturn(Boolean.FALSE);
when(badHTML.mkdirs()).thenReturn(Boolean.FALSE);
when(badHTML.setReadOnly()).thenReturn(Boolean.FALSE);
when(badHTML.setExecutable(true)).thenReturn(Boolean.FALSE);
when(badHTML.setExecutable(false)).thenReturn(Boolean.TRUE);
when(badHTML.setReadOnly()).thenReturn(Boolean.FALSE);
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(badHTML));
/*
badHTMLText is a string with the contents i want to put into the file,
can be just about whatever you want
*/
bw.append(badHTMLText);
bw.close();
} catch (IOException ex) {
System.err.println(ex);
}
}
任何想法或指导都将非常有帮助。在此之后的某个地方,我基本上尝试使用另一个类从文件读取。我将尝试模拟某种输入流,但另一个类不采用输入流,因为它是项目的io处理类。
您似乎追求相互矛盾的目标。一方面,您试图避免将数据写入磁盘,这在测试中并不是一个坏目标。另一方面,您正在尝试测试I /
O处理类,这意味着您将使用假定您File
将使用本机调用的系统实用程序进行工作。因此,这是我的指导:
File
。只是不要。太多的本地事物依赖于此。File
和将其转换为a Reader
的一半,以及从中解析HTML的一半Reader
。StringReader
即可模拟数据源。不要害怕重构您的类以简化测试,如下所示:
class YourClass {
public int method(File file) {
// do everything here, which is why it requires a mock
}
}
class YourRefactoredClass {
public int method(File file) {
return methodForTest(file.getName(), file.isFile(),
file.isAbsolute(), new FileReader(file));
}
/** For testing only. */
int methodForTest(
String name, boolean isFile, boolean isAbsolute, Reader fileContents) {
// actually do the calculation here
}
}
class YourTest {
@Test public int methodShouldParseBadHtml() {
YourRefactoredClass yrc = new YourRefactoredClass();
assertEquals(42, yrc.methodForTest(
"bad.html", true, false, new StringReader(badHTMLText));
}
}
在这一点上,逻辑输入method
非常简单,不值得测试,并且逻辑输入methodForTest
非常容易访问,可以对其进行大量测试。
我有以下测试代码:
问题内容: 我们要模拟的其中一个Java类中有一个URL对象,但这是最后一个类,因此不能。我们不想上一个级别,并模拟InputStream,因为这仍然会使我们留下未经测试的代码(我们有严格的测试覆盖率标准)。 我已经尝试过jMockIt的反射功能,但是我们在Mac上工作,并且Java代理处理程序存在我无法解决的问题。 那么,有没有不涉及在junit测试中使用真实URL的解决方案? 问题答案: 当我
我正在为一个引用硬编码文件名“classpath:config.properties”的应用程序编写测试。无法更改此名称。有没有办法用不同的配置测试这个应用程序?i、 e.不同的测试在运行时提供不同的配置? 这是一个奇怪的要求,但我非常感谢任何意见
问题内容: 我正在使用并测试异步操作创建者中的API调用。 当我使用这样创建的实例时,我无法使其工作: 我会像这样消耗它: 这是我的测试文件: 而且我只能执行一个操作,因为。 我尝试了多种方法来嘲笑该方法,但没有真正知道自己在做什么。 问题答案: 好,我知道了。这是我的解决方法!我最终 没有 做任何模拟库! 创建一个模拟在: 然后在您的测试文件中,要旨将如下所示:
问题内容: 请提供指针以帮助我模拟该java InputStream对象。这是我希望模拟的代码行: 问题答案:
问题内容: 我有一个仅接收单个文件,查找与之相关的文件并打开它的类。遵循以下原则 在我的单元测试中,我希望能够测试someMethod()而不必将物理文件放在某个地方。我可以模拟fileOne并将其传递给构造函数,但是由于在构造函数中正在计算fileTwo,因此我无法对此进行控制。 我可以模拟方法findRelatedFile()-但这是最佳实践吗?在这里寻找最佳设计,而不是寻求实用的解决方法。我