2016-07-15 24 views
0

Ich möchte Unit Test für einen meiner Services schreiben, um zu überprüfen, ob bestimmte Felder zugewiesen werden.So testen Sie einen Dienst, der das Attribut auf das neu erstellte Objekt setzt

public void createNewRecord(Dto dto) { 
    Record record = new Record(); 
    record.setName(dto.getName()); 
    record.setDetail(dto.getDetail()); 
    repo.save(record); 
} 

Ich habe keinen Konstruktor für dto weil ein Datensatz von anderen Methoden viele Attribute und einige von ihnen zugewiesen bekommen hat. Mein vorheriger Plan ist: Spott den Datensatz und verifizieren setName() und setDetail Methoden werden einmal aufgerufen. Aber es gibt keine Möglichkeit, verspottete Aufzeichnungen in diesen Dienst zu injizieren. Muss ich meinen vorherigen Code ändern? Jeder Gedanke wird geschätzt.

Antwort

1

Es gibt mehrere Ansätze:

Erstens:

Änderungsverfahren zu diesem

public void createNewRecord(Record record, Dao dao) 

Zweitens:

Verwenden PowerMockito Konstruktor zu verspotten

Drittens:

Verwenden Fabrik oder com.google.inject.Provider für Konstrukt Rekord (ich ziehe diese)

Forth: auch

Wenn ist Rekord Konstruktor einfach und Setter für Rekord Haben Sie keine spezielle Logik, dann können Sie nur Repo spotten und Repos Argument überprüfen.

0

Mocks sollten verwendet werden, um eine Abhängigkeit des getesteten Objekts zu verspotten, nicht um ein inneres Objekt in der getesteten Methode zu verspotten. Warum verspotten Sie nicht die Repo-Instanz und dann würden Sie mit Ihnen mock API überprüfen, dass repo.save() mit dem erwarteten Datensatz aufgerufen wird? Es scheint eine direkte Methode zu sein, Ihre Methode zu testen.

0

Sie können Mockito und seine @Captor Annotation verwenden, um die Argumente zu erfassen, die an die repo Instanz übergeben werden. Sie können @Mock das Dto Objekt Erwartungen für die getName() und getDetail() Methoden zu erstellen und behaupten, dass die Ergebnisse auf der aufgenommenen Record Instanz die setName() und setDetail() Methoden Aufrufe die gleichen Werte, die aus dem Dto Objekt sind. Zum Beispiel:

@Mock 
private Repo repo; 

@Mock 
private Dto dto; 

@Captor 
private ArgumentCaptor<Record> recordArgumentCaptor; 

private Service service; 

@Before 
public void setUp() throws Exception { 
    MockitoAnnotations.initMocks(this); 
    this.service = new Service(repo); 
} 

@Test 
public void shouldCreateNewRecord() { 
    when(dto.getName()).thenReturn("NAME"); 
    when(dto.getDetail()).thenReturn("DETAIL"); 

    service.createNewRecord(dto); 

    verify(repo).save(recordArgumentCaptor.capture()); 
    Record record = recordArgumentCaptor.getValue(); 

    assertThat(record.getName(), is(equalTo(dto.getName()))); 
    assertThat(record.getDetail(), is(equalTo(dto.getDetail()))); 
}