it-roy-ru.com

Mockito: метод имитации экземпляра для всех экземпляров класса

Я пытаюсь заглушить метод экземпляра определенного класса, так что когда любой экземпляр этого класса Foo вызывает этот метод экземпляра doSomething, возвращается тот же самый object (см. Код ниже). Тем не менее, mockito не допускает никаких совпадений вне проверки или заглушки.

Bar object = new Bar();
given(any(Foo.class).doSomething(Arg.class)).willReturn(object);

И в Foo.class:

Bar doSomething(Arg param) {
    Bar bar = new Bar();
    // Do something with bar
    return bar;
}

Как я могу достичь этой цели с помощью Mockito? Спасибо!

8
ddolce

Это должно работать:

 public class FooTest {
     @Mock
     private Foo foo;

     ...
     @Before
     public void setUp() {
        MockitoAnnotations.initMocks(this);
     }

     @Test
     public void testSomething() {
        Bar object = new Bar();
        when(foo.doSomething(any(Any.class))).thenReturn(object);
        ...
     }
}

Обновление 1  

Вы должны использовать PowerMock , если вы хотите, чтобы Foo возвращал тот же экземпляр Bar, когда вы вызываете метод doSomething для любого экземпляра Foo. Вот пример:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Foo.class)
public class FooMockAllInstanceTest {

    @Test
    public void testMockInstanceofObjectCreation() throws Exception {
        Bar mockBar = PowerMockito.mock(Bar.class);
        when(mockBar.sayHello()).thenReturn("Hi John!");
        PowerMockito.whenNew(Bar.class)
                .withNoArguments()
                .thenReturn(mockBar);

        Foo myFooOne = new Foo();
        assertEquals(mockBar,  myFooOne.doSomething("Jane"));

        Foo myFooTwo = new Foo();
        assertEquals(mockBar,  myFooTwo.doSomething("Sarah"));

        Baz bazOne = new Baz();
        assertEquals(mockBar, bazOne.doSomething("Sam"));

        Baz bazTwo = new Baz();
        assertEquals(mockBar, bazTwo.doSomething("Nina"));
    }
}

В этом примере возвращается тот же объект Bar, даже когда вызывается Baz. Вот класс Baz,

public class Baz {

    public Bar doSomething(String name) {
        Foo foo = new Foo();
        return foo.doSomething(name);
    }
}

Обновление 2

Есть еще несколько лучший способ тестирования с PowerMock. Вот оно,

@Test
public void testStubbingMethod() throws Exception {
    Bar mockBar = PowerMockito.mock(Bar.class);
    when(mockBar.sayHello()).thenReturn("Hi John!");

    PowerMockito.stub(PowerMockito.method(Foo.class, "doSomething",
            String.class)).toReturn(mockBar);

    Foo myFooOne = new Foo();
    assertEquals(mockBar, myFooOne.doSomething("Jane"));

    Foo myFooTwo = new Foo();
    assertEquals(mockBar, myFooTwo.doSomething("Sarah"));

    Baz bazOne = new Baz();
    assertEquals(mockBar, bazOne.doSomething("Sam"));

    Baz bazTwo = new Baz();
    assertEquals(mockBar, bazTwo.doSomething("Nina"));
}
2
Indra Basak