【问题标题】:EasyMock am I doing this right?EasyMock 我这样做对吗?
【发布时间】:2023-03-19 20:37:01
【问题描述】:

我正在构建一个 JEE EAR 应用程序,并开始使用 EasyMock 为我的服务正在使用的存储库创建模拟。但我不太确定结果是否正确。特别是我正在测试 void 方法的两个测试。

public class VenueServiceTest extends ServiceTest {

private VenueService venueService = new VenueServiceImpl();
private VenueRepository mockVenueRepository;    // interface that the service is using
private List<Venue> venues;
private Venue venue1;
private Venue venue2;

@Override
public void setupMock() {
    venues = MockUtils.getMockedVenues();
    venue1 = venues.get(0);
    venue2 = venues.get(1);
    mockVenueRepository = createMock(VenueRepository.class);
    venueService.setRepository(mockVenueRepository);
}

@Override
public void testUpdate() {
    Venue originalVenue = new Venue(0L, "The Venue");
    String originalName = originalVenue.getName();

    mockVenueRepository.update(originalVenue);
    expect(mockVenueRepository.findById(originalVenue.getId())).andReturn(originalVenue);
    replay(mockVenueRepository);

    originalVenue.setName("Another Venue");
    venueService.updateEntity(originalVenue);

    Venue newVenue = venueService.getEntity(originalVenue.getId());
    String newName = newVenue.getName();

    assertFalse("Venue names should not be equal", originalName.equals(newName));

    verify(mockVenueRepository);
}

@Override
public void testDelete() {
    expect(mockVenueRepository.findById(venue1.getId())).andReturn(venue1);
    mockVenueRepository.remove(venue1);
    expect(mockVenueRepository.findById(venue1.getId())).andReturn(null);

    replay(mockVenueRepository);


    assertNotNull(venueService.getEntity(venue1.getId()));
    venueService.deleteEntity(venue1);
    assertNull(venueService.getEntity(venue1.getId()));
    verify(mockVenueRepository);
}

这两项测试都通过了。但是,如果我注释掉删除/更新部分,它们仍然会通过。

@Override
public void testUpdate() {
    Venue originalVenue = new Venue(0L, "The Venue");
    String originalName = originalVenue.getName();

    // mockVenueRepository.update(originalVenue);
    expect(mockVenueRepository.findById(originalVenue.getId())).andReturn(originalVenue);
    replay(mockVenueRepository);

    originalVenue.setName("Another Venue");
    // venueService.updateEntity(originalVenue);

    Venue newVenue = venueService.getEntity(originalVenue.getId());
    String newName = newVenue.getName();

    assertFalse("Venue names should not be equal", originalName.equals(newName));

    verify(mockVenueRepository);
}

@Override
public void testDelete() {
    expect(mockVenueRepository.findById(venue1.getId())).andReturn(venue1);
    //  mockVenueRepository.remove(venue1);
    expect(mockVenueRepository.findById(venue1.getId())).andReturn(null);

    replay(mockVenueRepository);


    assertNotNull(venueService.getEntity(venue1.getId()));
    //  venueService.deleteEntity(venue1);
    assertNull(venueService.getEntity(venue1.getId()));
    verify(mockVenueRepository);
}

我这样做对吗?我的猜测是否定的,如果是这样,您如何正确测试?

谢谢!

【问题讨论】:

  • 你的代码有点混乱;但只是作为一个初学者:尝试使用 createStrictMock。严格的模拟,很好,更严格。这使得使用它们有时变得更加困难(因为它们坚持你在它们上指定的调用顺序),但另一方面,它们的严格有时正是你想要的。
  • 感谢您的回复。不幸的是,这并没有解决问题。

标签: java jakarta-ee easymock


【解决方案1】:

对于更新,您正在录制以返回originalVenue。由于您正在修改其名称,因此它确实会有所不同。通过所有测试,只有一个originalVenue 实例。

对于删除,您正在录制venue1,然后是null。因此,如果您拨打findById 两次,您将收到venue1null。测试删除,您可以只模拟remove 方法以确保它被调用。调用getEntity 会让你测试与删除无关的getEntity

基本上,为了测试更新和删除,我会这样做

@Override
public void testUpdate() {
    Venue originalVenue = new Venue(0L, "The Venue");
    String originalName = originalVenue.getName();

    mockVenueRepository.update(originalVenue);
    replay(mockVenueRepository);

    originalVenue.setName("Another Venue");
    venueService.updateEntity(originalVenue);

    verify(mockVenueRepository);
}

@Override
public void testDelete() {
    mockVenueRepository.remove(venue1);
    replay(mockVenueRepository);

    venueService.deleteEntity(venue1);

    verify(mockVenueRepository);
}

【讨论】:

  • 谢谢!现在更有意义了:)
猜你喜欢
  • 2012-08-13
  • 1970-01-01
  • 2015-01-13
  • 2015-06-09
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多