2016-07-01 15 views
1

Ich baue eine JEE EAR-Anwendung und ich begann mit EasyMock zu arbeiten, um Mocks für die Repositories zu erstellen, die meine Dienste verwenden. Aber ich bin mir nicht sicher, ob das Ergebnis richtig ist. Vor allem zwei Tests, bei denen ich leere Methoden teste.EasyMock mache ich das richtig?

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

Beide dieser Test besteht. Aber wenn ich die Delet-/Update-Teile auskommentiere, die sie noch passieren.

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

Mache ich das richtig? Meine Vermutung ist nein und wenn ja, wie testen Sie das richtig?

Vielen Dank!

+1

Ihr Code ein wenig verwirrend ist tun; aber nur als Vorspeise: versuche mit ** createStrictMock **. Strenge Mocks sind gut, viel strenger. Das macht es manchmal schwieriger, sie zu verwenden (da sie auf der Reihenfolge der Aufrufe bestehen, die Sie auf ihnen angeben), aber auf der anderen Seite ist es manchmal genau das, was Sie wollen. – GhostCat

+0

Vielen Dank für Ihre Antwort. Leider hat das das Problem nicht gelöst. – Johan

Antwort

1

Für das Update wird aufgezeichnet, um originalVenue zurückzugeben. Da Sie seinen Namen ändern, wird es in der Tat anders sein. Es gibt nur eine Instanz von originalVenue durch den gesamten Test.

Zum Löschen speichern Sie venue1 und dann null. Wenn Sie also zweimal findById anrufen, erhalten Sie venue1 und null. Der Test das Löschen, können Sie nur die remove Methode verspotten, um sicherzustellen, dass es aufgerufen wird. Wenn Sie getEntity aufrufen, testen Sie getEntity, was nichts mit dem Löschen zu tun hat.

Grundsätzlich Update zu testen und löschen, würde ich

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

Vielen Dank! Es macht jetzt mehr Sinn :) – Johan