Проверить передачу ссылки на метод - PullRequest
2 голосов
/ 27 мая 2020

У меня есть эта настройка (упрощенная):

import java.util.function.Function;

public class Foo {
    Bar bar;

    void myMethod() {
        final Function<String, String> reference;
        if (...)
            reference = String::toLowerCase;
        else
            reference = String::toUpperCase;

        this.bar.otherMethod(reference);
    }
}

class Bar {
    void otherMethod(final Function<String, String> transform) {
        /* ... */
    }
}

Я хотел бы проверить поведение "myMethod".

Я попытался имитировать экземпляр bar, вызовите myMethod метод и verify(bar).otherMethod(expectedReference)

К сожалению, этот подход не работает, в основном потому, что - как описано в { ссылка } - ссылка на метод компилируется в новый экземпляр анонимного класса.

Есть ли другой способ проверить, что правильная ссылка была передана на bar.otherMethod(...)? Имейте в виду, что myMethod не вызывает саму ссылку (ни otherMethod ... переменная передается для 2-3 вложенных вызовов).

1 Ответ

3 голосов
/ 27 мая 2020

Вы можете имитировать Bar и использовать ArgumentCaptor для захвата значения, переданного в otherMethod, а затем утверждать, что это ожидаемая ссылка. Простой тестовый класс может выглядеть так (импорт для краткости опущен):

@RunWith(MockitoJUnitRunner.class)
class MyTest {
    @Mock
    private Bar bar;
    @InjectMocks
    private Foo foo;
    @Captor
    private ArgumentCaptor<Function<String, String>> captor;

    @Test
    public void test() {
        // insert your arguments here if you have any
        foo.myMethod();
        // verify bar is called and capture the method reference
        verify(bar).otherMethod(captor.capture());
        Function<String, String> transform = captor.getValue();
        // do some assertions here, just checking that String::toLowerCase was used
        // you may change this to fit your needs
        Assert.assertEquals("somevalue", transform.apply("SomEvALuE"));
    }
}

Весь приведенный выше фрагмент, конечно, упрощен, потому что вы предоставили упрощенный пример. Также: возможно, вы не сможете использовать @InjectMocks, потому что вам нужно ввести Bar другим способом в Foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...