尝试让Mockito和PowerMock行事,但在尝试运行此代码时我得到textview
:
SELECT *
FROM Student
WHERE STARTIME >= Dateadd(MINUTE, -5, GETDATE())
和这个IO类
git checkout -b temp_branch
git add -A
git commit -m 'wip'
git fetch origin
git pull --rebase origin/master
我想要做的是以某种方式触发UnfinishedStubbingException
,以便@RunWith(PowerMockRunner.class)
@PrepareForTest(FileIOHelper.class)
public class FileIOHelperTest {
@Test
public void testIOExceptionOnWrite() {
PowerMockito.mockStatic(FileIOHelper.class);
PowerMockito.doThrow(new IOException()).when(FileIOHelper.class);
PowerMockito.verifyStatic();
FileIOHelper.write(Mockito.anyString(), Mockito.anyString());
}
@After
public void validate() {
Mockito.validateMockitoUsage();
}
}
可以进行测试。为什么有人会问?我正在查看我的Jacoco报告,我看到了:
我看过:
我仍然完全迷失了。我不知道是否需要触发public final class FileIOHelper {
public static void write(final String file, String message, final boolean appendNewLine) {
if(checkArgs(file, message)) {
final Path path = Paths.get(file);
StandardOpenOption mode = StandardOpenOption.APPEND;
if(Files.notExists(path)) {
mode = StandardOpenOption.CREATE_NEW;
}
if(appendNewLine) {
message += System.getProperty("line.separator");
}
try {
Files.write(path, message.getBytes(), mode);
} catch(IOException e) {
handleException(e, "Problem writing to " + file);
}
}
}
private static boolean checkArgs(final String... args) {
if(args != null && args.length > 0) {
for(final String arg : args) {
if(arg == null || arg.isEmpty()) {
return false;
}
}
}
return true;
}
private static void handleException(final IOException e, final String errorMsg) {
handleException(e, errorMsg, true);
}
private static void handleException(final IOException e, final String errorMsg, final boolean printStace) {
checkArgs(errorMsg);
System.err.println(errorMsg);
System.err.println(e.getMessage());
if(printStace) {
e.printStackTrace();
}
}
}
,或者我是否能以某种方式验证IOException
的输出而不是handleException
。有人,帮忙!
错误日志:
IOException
答案 0 :(得分:0)
我的建议:忘记关于使用PowerMock。
如果你必须模拟静态方法,那么围绕它构建你自己的小包装类。然后,为了进行测试,您的包装器可以返回您控件;并用于生产用途;你的包装器只调用静态方法。
PowerMock看起来像许多问题的解决方案;但不久之后,它将成为更多问题的原因。它打破了覆盖范围,使得更改底层JVM变得更加困难,等等。
说真的:如果您的设计只能使用PowerMock进行测试,这通常表明您的设计糟糕。所以:专注于重新测试你的代码;而不是把时间投入像PowerMock这样弊大于利的工具。
我花了无数个小时试图解决PowerMock问题;因为我开始改为编写“更好地测试”生产代码......我已经编写了数百或数千个测试而无需再次使用PowerMock。
在您的情况下:首先避免遍布静态。基本上你通过(最糟糕的情况)实现了那个围绕你必须做的静态调用的小包装类。对于测试,您可以模拟包装器对象;在生产代码中,您使用依赖注入来提供简单地进行静态调用的(singleton / enum)包装器对象。
答案 1 :(得分:0)
答案 2 :(得分:0)
首先,你必须模拟“文件”类,而不是“FileIOHelper”。 FileIOHelper是经过测试的类。其次,您没有指定应该抛出IOException的方法。单元测试方法应如下所示(假设测试方法捕获并管理IOException):
@RunWith(PowerMockRunner.class)
@PrepareForTest(Files.class)
public class FileIOHelperTest {
@Test
public void testIOExceptionOnWrite() {
PowerMockito.mockStatic(Files.class);
PowerMockito.doThrow(new IOException()).when(Files.class);
Files.write("path", "message", true);
FileIOHelper.write("path", "message", true);
PowerMockito.verifyStatic();
Files.write("path", "message", true);
}
}