【问题标题】:PowerMockRule together with EasyMock NOT MoquitoPowerMockRule 和 EasyMock NOT Moquito
【发布时间】: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


【解决方案1】:

最后我不得不放弃并创建了另一个测试类

@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());
  }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多