PowerMockRule together with EasyMock NOT Moquito



我正在一个遗留项目上,使用 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());
  }
}

它有效,但并不完美,感谢那些试图帮助我的人!

最新更新