gpt4 book ai didi

java - PowerkMock-ing BufferedReader 间歇运行

转载 作者:行者123 更新时间:2023-11-29 08:38:18 25 4
gpt4 key购买 nike

我想做的是模拟新创建的 BufferedReader 实例。这是应该测试的代码:

A.java

...
@Override
public String read(String fileName) throws IOException {
...

try {
fileReader = new FileReader(fileName);
bufferedReader = new BufferedReader(fileReader);
String tmp;
StringBuilder builder = new StringBuilder();
while ((tmp = bufferedReader.readLine()) != null) {
builder.append(tmp);
}
return builder.toString();
} catch (IOException e) {
...
} finally {
...
}
}
...

我必须做的是对 FileReader 创建和 BufferedReader 创建进行 PowerMock。

ATest.java

@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
public class ATest {

@Mock
private FileReader fileReader;
@Mock
private BufferedReader bufferedReader;
...

@Test
public void test() throws Exception {
PowerMockito.whenNew(FileReader.class).withArguments(FILE_NAME).thenReturn(fileReader);
PowerMockito.whenNew(BufferedReader.class).withAnyArguments().thenReturn(bufferedReader);
PowerMockito.doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) throws Throwable {
return "test";
}
}).when(bufferedReader).readLine();
assertArrayEquals(reader.read(FILE_NAME), new String[]{"test"});
}
}

但是测试永远不会终止。我什至无法调试它。

一旦 PowerMockito.doAnswer() 被移除,代码就会被执行(并且可以用于调试)。我也尝试过使用 Mockito.mock() 而不是 PowerMockito.doAnswer(),但没有帮助。

什么可能导致测试中止执行?

最佳答案

只是换个角度:可以说代码中的真正问题是对 FileReader/BufferedReader 的 new() 的两次调用。

如果您将 Reader 传递给此方法会怎么样?而不是表示文件名的字符串?

如果您将“ReaderFactory”传递给包含此方法read(String) 的底层类会怎样? (您将在其中使用依赖注入(inject) 将该工厂添加到您的类中)

然后:您将看到一个改进的设计 - 您将不需要使用 PowerMock。您可以退后一步,使用 Mockito 或 EasyMock;因为不再需要模拟调用 new

所以,我的回答是:您创建了难以测试的代码。现在您尝试使用大(丑陋)的 PowerMock 锤子修复设计问题。是的,那会起作用。但它只是第二好的选择。

更合理的选择是学习如何编写可测试的代码(例如开始here);好吧,编写可测试的代码。并停止使用 PowerMock(几个月前我就这样做了;在经历了很多 PowerMock 引起的痛苦之后;我从未后悔过这个决定)。

关于java - PowerkMock-ing BufferedReader 间歇运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42182260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com