Java PowerMockRule与EasyMock而非Moquito一起使用

Java PowerMockRule与EasyMock而非Moquito一起使用,java,junit,easymock,powermock,Java,Junit,Easymock,Powermock,我在一个遗留项目中,使用EasyMock,没有选择包括Mockito,也就是说我在使用PowerMockRule进行单元测试时遇到了问题。我找到的关于如何利用规则的几乎所有例子都是用Mockito制作的。我真的需要一些人帮我解决这个问题 @RunWith(UnitilsJUnit4TestClassRunner.class) public class ModuleCloningServiceImplTest { @Rule public PowerMockRule rule = new

我在一个遗留项目中,使用EasyMock,没有选择包括Mockito,也就是说我在使用PowerMockRule进行单元测试时遇到了问题。我找到的关于如何利用规则的几乎所有例子都是用Mockito制作的。我真的需要一些人帮我解决这个问题

@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());
  }
@RunWith(UnitilsJUnit4TestClassRunner.class)
公共类ModuleConningServiceImplTest{
@统治
public PowerMockRule rule=新的PowerMockRule();
//...
@试验
public void copyModuleToPages\u success\u customLayoutTileCopy\u default\u tile(){
ModuleType ModuleType=getModuleType(ModuleTypeCode.优惠券,2,3);
Module Module=getModule(1L,moduleType);
Page copyPage=getPage(1L,moduleType);
PageLayout newPageLayout=DomainObjectBuilder.newPageLayout().build();
newPageLayout.setCode(PageLayoutCode.CUSTOM);
copyPage.setPageLayout(newPageLayout);
列表页面=Arrays.asList(copyPage);
mockStatic(CustomPageLayoutUtils.class);
CustomPageLayoutUtils.tileNumberExistsInCustomPageLayout(9,null);
expectLastCall().andReturn(false);
CustomPageLayoutUtils.GetPreferredOrderFaultTile(copyPage,moduleType);
expectLastCall().once().andReturn(2);
PowerMock.replayAll();
OperationReport OperationReport=ModuleColiningService.copyModuleToPages(模块,第9页);
PowerMock.verifyAll();
检查CopySuccessInPages(页);
用于(第页:页){

对于(ModulePage,最后我不得不让步,只是创建了另一个测试类

@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());
  }
}
@RunWith(PowerMockRunner.class)
@PrepareForTest({CustomPageLayoutUtils.class})
公共类ModuleConningServiceImplPowerMockTest{
私有ModuleConningServiceImpl ModuleConningService;
private final CouponViewer moduleContent=新CouponViewer();
私有最终页面布局PageLayout=DomainObjectBuilder.newPageLayout().build();
私人地盘;
私人产品;
私人克鲁多克鲁多;
私人审计记录器;
@以前
公共void init(){
ModuleConningService=新的ModuleConningServiceImpl();
crudDao=PowerMock.createMock(crudDao.class);
auditlogger=PowerMock.createMock(auditlogger.class);
ReflectionUtils.setByType(ModuleConningService,crudDao);
ReflectionUtils.setByType(ModuleConningService,auditlogger);
产品=新产品(1L);
site=DomainObjectBuilder.newSite().withId(1l).withProduct(product.build();
mockStatic(CustomPageLayoutUtils.class);
}  
@试验
public void copyModuleToPages\u success\u customLayoutTileCopy\u default\u tile(){
ModuleType ModuleType=getModuleType(ModuleTypeCode.优惠券,2,3);
Module Module=getModule(1L,moduleType);
Page copyPage=getPage(1L,moduleType);
PageLayout newPageLayout=DomainObjectBuilder.newPageLayout().build();
newPageLayout.setCode(PageLayoutCode.CUSTOM);
copyPage.setPageLayout(newPageLayout);
列表页面=Arrays.asList(copyPage);
CustomPageLayoutUtils CustomPageLayoutUtils=PowerMock.createMock(CustomPageLayoutUtils.class);
customPageLayoutUtils.tileNumberExistsInCustomPageLayout(9,null);
expectLastCall().andReturn(false);
customPageLayoutUtils.GetPreferredOrderFaultTile(copyPage,moduleType);
expectLastCall().andReturn(1);
save(EasyMock.anyObject());
expectLastCall();
auditlogger.audit(EasyMock.anyObject(AuditLogEntry.class));
PowerMock.replayAll();
OperationReport OperationReport=ModuleColiningService.copyModuleToPages(模块,第9页);
PowerMock.verifyAll();
检查CopySuccessInPages(页);
用于(第页:页){

对于(ModulePage对PowerMock了解不多,但这是否与缺少
@PrepareForTest
有关?当您使用
@Rule
注释时,似乎也声称您不需要
@RunWith
注释……如果我从零开始编写测试,我确实不需要它。然而,这是一个需要扩展的遗留测试如果我删除runswith…那么一切都失败了,所以我需要保留它。因此我需要规则。如果我使用PowerMockRunner运行,我可以让我的测试工作,但其他测试失败。最实用的方法是编写另一个测试类,然后使用PowerMockRunner运行。但这太难看了,我喜欢正确地执行它我将研究PrepareForest,但我真诚地怀疑它是否可能是这样。我已经看到了PowerMock上方法的使用顺序,并注意到您没有遵循它。在PowerMock的wiki页面上,第一个示例显示它模拟静态类,对方法执行expect,然后执行repl是的,调用测试方法。我看到的示例在这里,请尝试一下。谢谢,我今天下午会尝试,我会告诉你结果