EasyMock 我这样做对吗?

EasyMock am I doing this right?

我正在构建一个 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);
}

这两个测试都通过了。但是,如果我注释掉 delet/update 部分,它们仍然会通过。

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

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

谢谢!

对于更新,您正在录制到 return 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);
}