【发布时间】:2014-01-10 08:05:17
【问题描述】:
我在一个遗留项目上,使用 EasyMock,但没有选择包含 Mockito,据说我在让单元测试与 PowerMockRule 一起工作时遇到了麻烦。我发现的几乎所有关于如何利用该规则的示例都是用 Mockito 制作的。我真的可以使用 EasyMock 帮助解决这个问题。
@RunWith(UnitilsJUnit4TestClassRunner.class)
public class ModuleCloningServiceImplTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
//...
@Test
public void copyModuleToPages_success_customLayoutTileCopy_default_tile() {
ModuleType moduleType = getModuleType(ModuleTypeCode.COUPON, 2, 3);
Module<CouponViewer> module = getModule(1L, moduleType);
Page copyPage = getPage(1L, moduleType);
PageLayout newPageLayout = DomainObjectBuilder.newPageLayout().build();
newPageLayout.setCode(PageLayoutCode.CUSTOM);
copyPage.setPageLayout(newPageLayout);
List<Page> pages = Arrays.asList(copyPage);
PowerMock.mockStatic(CustomPageLayoutUtils.class);
CustomPageLayoutUtils.tileNumberExistsInCustomPageLayout(9, null);
expectLastCall().andReturn(false);
CustomPageLayoutUtils.getPreferredOrDefaultTile(copyPage, moduleType);
expectLastCall().once().andReturn(2);
PowerMock.replayAll();
OperationReport operationReport = moduleCloningService.copyModuleToPages(module, pages, 9);
PowerMock.verifyAll();
checkCopySuccessInPages(pages);
for (Page page : pages) {
for (ModulePage<? extends JaxbModule> modulePage : page.getModulePages()) {
Assert.assertEquals(Integer.valueOf(2), modulePage.getTileNumber());
}
}
Assert.assertTrue(operationReport.isSuccesful());
}
对 CustompPageLayoutUtils 的每次调用都是进入方法而不是使用模拟。我已经对此代码尝试了一些排列,但这是我最后一次尝试。任何见解都将非常受欢迎。我希望还有其他人可以利用这个问题的解决方案。
【问题讨论】:
-
不太了解PowerMock,但这与缺少
@PrepareForTest有关吗? -
另外this page 似乎声称您在使用
@Rule注释时不需要@RunWith..... -
确实,如果我在哪里从头开始编写测试,我就不需要它。然而,这是一个需要扩展的遗留测试。如果我删除运行...那么一切都会失败,所以我需要保留它。因此我需要规则。如果我使用 PowerMockRunner 运行,我可以让我的测试正常工作,但是其他测试会失败。最实用的方法是编写另一个测试类并使用 PowerMockRunner 运行它。但这太丑陋了,我喜欢做正确的事而不是解决方法。我会调查 PrepareForTest,但我真诚地怀疑会是这样,但可能是这样。
-
我在 PowerMock 上看到了方法的使用顺序,并注意到您没有遵循它。在 PowerMock 的 wiki 页面上,第一个示例显示它模拟静态类,对方法执行期望,然后进行重播并调用测试方法。我看到的例子在这里powermock所以,试一试。
-
谢谢,我下午试试,结果告诉你
标签: java junit easymock powermock