2016-10-29 6 views
0

für die gegebene:Mockito sequenziellen Methodenaufruf in `when`

@Mock 
View view; 

Ich möchte, wenn ((View) view.getParent()).getWidth(); z.B. zurückzukehren aufgerufen 400, aber ohne die getParent() zu verspotten.

Ähnlich wie when(((View) view.getParent()).getWidth()).thenReturn(400); (dies funktioniert nicht).

Ich weiß, dass es eine Einstellung in Mockito gibt (aber ich kann nicht finden), die sequentiellen Methodenaufruf erlaubt.

+1

Sie können dem Elternteil nicht sagen, dass er 400 zurückgeben soll, ohne sich über die Eltern lustig zu machen. –

+0

@JBNizet Wegen des Castings? – Diolor

Antwort

1

Sie müssen @Mock zu @Mock(answer = Answers.RETURNS_DEEP_STUBS) ändern. Ohne dies würde view.getParent() immer null zurückgeben. manuell, d.h .:

View parent = mock(View.class); 
when(view.getParent()).thenReturn(parent); 

Mockito documentation für RETURNS_DEEP_STUBS

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Answers; 
import org.mockito.Mock; 
import org.mockito.runners.MockitoJUnitRunner; 

import static org.assertj.core.api.Assertions.assertThat; 
import static org.mockito.Mockito.when; 

@RunWith(MockitoJUnitRunner.class) 
public class ATest { 

    @Mock(answer = Answers.RETURNS_DEEP_STUBS) 
    View view; 

    @Test 
    public void test() { 
     when(view.getParent().getWidth()).thenReturn(400); 
     assertThat(view.getParent().getWidth()).isEqualTo(400); 
    } 
} 

Es ist eine Abkürzung für mock für view.getParent() Aufruf zu schaffen.

1

Mykhailos Antwort geht ins Detail über eine Möglichkeit, dies automatisch mit RETURNS_DEEP_STUBS; Sie könnten es auch manuell tun, was so klingt, als ob Sie es vermeiden möchten, aber genau das würde ich in Ihrer Situation tun.

Wie JB Nizet in den Kommentaren sagte, müssen Sie die Eltern verspotten, um diese Arbeit zu machen. Dies liegt daran, dass eine @Mock View keine echte Ansicht ist, so dass getParentnull zurückgibt, es sei denn, Sie stubeln es anderweitig ab. Das bedeutet, Sie müssen stub getParent, um eine echte 400px-Wide-Ansicht oder stub getParent zurückgeben eine übergeordnete Ansicht, die Sie mock, so dass getWidth 400 zurückgibt. (Es gibt ein paar andere Optionen, wie eine @Spy einer realen Ansicht verwenden, Aber dann hätte Ihre ausspionierte Ansicht einen echten 400 Pixel breiten Elternteil und Sie wären nicht in dieser Situation.)