Java 模仿一个无效的方法

Java 模仿一个无效的方法,java,junit,easymock,Java,Junit,Easymock,这是我第一次尝试使用EasyMock。因此,我一直在尝试模拟一个void方法: protected void onStop() { logger.info("Stopping ReporterService."); if (reporter != null) { reporter.stop(); reporter = null; } } 我在网上学习了一些教程,并写了以下内容: ReporterService reporterServi

这是我第一次尝试使用EasyMock。因此,我一直在尝试模拟一个
void
方法:

protected void onStop() {
    logger.info("Stopping ReporterService.");

    if (reporter != null) {
        reporter.stop();
        reporter = null;
    }
}
我在网上学习了一些教程,并写了以下内容:

ReporterService reporterService1 = EasyMock.createMock(ReporterService.class);

reporterService1.onStop();
EasyMock.expectLastCall().once();
replay(reporterService1);

//EasyMock.replay(reporterService1);
assertNull(Whitebox.getInternalState(reporterService1, "reporter"));
EasyMock.verify(reporterService1);
但后来我发现:

java.lang.AssertionError:
验证时预期失败:
ReporterService.onStop():应为1,实际为0

我在网上搜索过,但不知道为什么会这样。谢谢你的帮助

另外,为了便于理解,我手动测试了它,它可以工作,我只想使用Easymock进行测试:

ReporterService reporterService = new ReporterService();
Reporter reporter = new Reporter(null,null,null);

Whitebox.setInternalState(reporterService , "reporter", reporter);
assertNotNull(Whitebox.getInternalState(reporterService, "reporter"));

reporterService.onStop();
assertNull(Whitebox.getInternalState(reporterService, "reporter"));

我认为这应该解决你的问题。 1.应首先使用setInternelState设置reporter对象 2.您的方法需要调用reporter.stop(),因此您的测试应该需要该方法

请看下面的代码。您可以在末尾添加断言

ReporterService reporterService1 = EasyMock.createMock(ReporterService.class);
Reporter reporter = EasyMock.createMock(Reporter.class);

Whitebox.setInternalState(reporterService , "reporter", reporter);
reporter.onStop();
PowerMock.expectLastCall();

EasyMock.replay(reporterService1,reporter);

reporterService1.onStop();

EasyMock.verify(reporterService1,reporter);

现在还不清楚你到底想测试什么。你在测试记者是否被阻止?如果是这样的话,你应该取而代之的是嘲笑记者。乍一看,你的测试代码看起来不错。因此,接下来要研究的是。。。您的问题中缺少的东西是:正在测试的代码。即使您确定Whitebox.getInternalState()。。。应该在其参数上调用onStop。。。您最好在此处发布该代码(请参阅)。没有这些,我们就无能为力!您不需要PowerMock来模拟void方法。另外,您不需要
expectLastCall()
,它确实存在于EasyMock中,但不是必需的。我还建议您使用静态导入。您将获得
reporter.onStop();重播(reporterService1,reporter)