我正在一个遗留项目上,使用 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 都是在输入方法,而不是使用模拟。 我已经尝试了对这段代码进行一些渗透,但这是我最后一次尝试。 任何见解都将非常受欢迎。 我希望还有其他人可以利用这个问题的解决方案。
最后我不得不屈服,只是创建了另一个测试类
@RunWith(PowerMockRunner.class)
@PrepareForTest( { CustomPageLayoutUtils.class })
public class ModuleCloningServiceImplPowermockTest {
private ModuleCloningServiceImpl moduleCloningService;
private final CouponViewer moduleContent = new CouponViewer();
private final PageLayout pageLayout = DomainObjectBuilder.newPageLayout().build();
private Site site;
private Product product;
private CrudDao crudDao;
private AuditLogger auditlogger;
@Before
public void init() {
moduleCloningService = new ModuleCloningServiceImpl();
crudDao = PowerMock.createMock(CrudDao.class);
auditlogger = PowerMock.createMock(AuditLogger.class);
ReflectionUtils.setByType(moduleCloningService, crudDao);
ReflectionUtils.setByType(moduleCloningService, auditlogger);
product = new Product(1L);
site = DomainObjectBuilder.newSite().withId(1l).withProduct(product).build();
PowerMock.mockStatic(CustomPageLayoutUtils.class);
}
@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);
CustomPageLayoutUtils customPageLayoutUtils = PowerMock.createMock(CustomPageLayoutUtils.class);
customPageLayoutUtils.tileNumberExistsInCustomPageLayout(9, null);
expectLastCall().andReturn(false);
customPageLayoutUtils.getPreferredOrDefaultTile(copyPage, moduleType);
expectLastCall().andReturn(1);
crudDao.save(EasyMock.anyObject());
expectLastCall();
auditlogger.audit(EasyMock.anyObject(AuditLogEntry.class));
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(1), modulePage.getTileNumber());
}
}
Assert.assertTrue(operationReport.isSuccesful());
}
}
它有效,但并不完美,感谢那些试图帮助我的人!