最终类的PowerMock UnfinishedStubbingException错误

时间:2016-05-18 05:32:49

标签: java unit-testing junit mockito powermock

尝试让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报告,我看到了:

jacoco report

我看过:

我仍然完全迷失了。我不知道是否需要触发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

3 个答案:

答案 0 :(得分:0)

我的建议:忘记关于使用PowerMock。

如果你必须模拟静态方法,那么围绕它构建你自己的小包装类。然后,为了进行测试,您的包装器可以返回控件;并用于生产用途;你的包装器只调用静态方法。

PowerMock看起来像许多问题的解决方案;但不久之后,它将成为更多问题的原因。它打破了覆盖范围,使得更改底层JVM变得更加困难,等等。

说真的:如果您的设计只能使用PowerMock进行测试,这通常表明您的设计糟糕。所以:专注于重新测试你的代码;而不是把时间投入像PowerMock这样弊大于利的工具。

我花了无数个小时试图解决PowerMock问题;因为我开始改为编写“更好地测试”生产代码......我已经编写了数百或数千个测试而无需再次使用PowerMock。

在您的情况下:首先避免遍布静态。基本上你通过(最糟糕的情况)实现了那个围绕你必须做的静态调用的小包装类。对于测试,您可以模拟包装器对象;在生产代码中,您使用依赖注入来提供简单地进行静态调用的(singleton / enum)包装器对象。

答案 1 :(得分:0)

  1. 首先,检查IOException异常 - 应该在方法签名中使用throws声明它。但你的方法FileIOHelper.write没有这样的。这可能是UnsutisfiedStubbingException的原因。
  2. 我不明白,你要测试的是什么:如果FileIOHelper是一个mock - handleException永远不会被调用,因为它是由真正的write方法调用的,而不是被模拟的。

答案 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);
  }
}