Java Как смоделировать объект и статический метод в Java? - PullRequest
1 голос
/ 01 октября 2011

Я пишу джунит CustomerHelper, который внутренне вызывает метод объекта AccountHelper.CustomerHelper создает объект AccountHelper с оператором new внутри одного из его методов.Теперь, если я хочу смоделировать объект AccountHelper. Есть ли способ, которым я могу это сделать?

Если бы эта зависимость (в данном случае AccountHelper) была бы введена каким-то сеттером или конструктором,я мог бы установить свой MockAccountHelper. Верно?Но есть ли какой-нибудь способ, которым мы можем выполнять насмешку, когда создаем зависимость с помощью оператора New?

Второй вопрос: - Есть ли в любом случае, мы можем высмеивать статические методы, используя базовую библиотеку Java, не переходя к Power / Easy Mock«Даже если я идиотничаю, хочу вкратце понять, как у него это получается?»

Ответы [ 5 ]

1 голос
/ 01 октября 2011

JMockit позволяет легко макетировать статические методы и внутренне созданные объекты.

Вы бы сделали что-то вроде этого:

@Test
public void testWhatever() {
    new Expectations() {
        AccountHelper accountHelper;
        {
            new AccountHelper();
            accountHelper.someMethod();
    }}
    objectUnderTest.doWhatever();
}

Я неПолагаю, что в ядре библиотеки Java есть встроенный способ имитации статических методов.Я также не уверен, что именно происходит внутри, но я думаю, что JMockit выполняет какие-то манипуляции на уровне байт-кода для замены классов на лету.

0 голосов
/ 16 августа 2017

Я использую следующую структуру кода при тестировании статических методов.

Powermock.mockStatic(Something.class)

Something.someMethod(); // Static Method you want to mock
EasyMock.expectLastCall().andReturn(/*Whatever you want to return*/);

Powermock.replay(Something.class);

// Call which makes use of Something.someMethod

Powermock.verify(Something.class);

В идеале вам не нужно тестировать статические методы. PowerMock - это инфраструктура Java, которая позволяет выполнять модульный тестовый код, обычно рассматриваемый как непроверяемый.

0 голосов
/ 22 февраля 2017

Существует библиотека powermockito, позволяющая имитировать вызов статического метода внутри класса тестирования. Репозиторий maven для библиотеки powermockito:

<dependency>
 <groupId>org.powermock</groupId>
 <artifactId>powermock-api-mockito</artifactId>
 <version>1.6.6</version>
</dependency>

Если вы хотите больше узнать о powermockito, вот ссылка .

0 голосов
/ 01 октября 2011

Если бы эта зависимость (в данном случае AccountHelper) была введена каким-либо сеттером или конструктором, я мог бы установить свой MockAccountHelper.Right?Но есть ли способ, которым мы можем выполнять насмешку, когда создаем зависимость с оператором New?

Да - это правильно, но более важно, чтобы объект вводился в виде интерфейса, реализующего интерфейскоторый затем может быть использован по типу насмешек.Проблема с типами насмешек, которые не имеют четкого интерфейса, заключается в том, что нелегко создавать параллельные типы насмешек, гарантирующие соблюдение первоначального контракта при изменении реализации.

Единственный способ, который я вижу возможным в вашемДело в том, чтобы создать новый тип AccountHelperMock, который расширяет AccountHelper и переопределяет все методы (я надеюсь, что это возможно).Затем в вашем коде замените new AccountHelper() на new AccountHelperMock() вручную, где вы хотите это смутить.

0 голосов
/ 01 октября 2011

Вам понадобится способ установить желаемый макет AccountHelper для вашего CustomerHelper в ваших тестовых примерах.Поэтому вашему классу CustomerHelper потребуется либо установщик для AccountHelper, либо конструктор, который может передать требуемый AccountHelper.Я предполагаю, что у вас нет способа установить макет, если AccountHelper создается локально в методе.У вас нет доступа к нему извне (например, к вашему тестовому пакету junit), его область действия только локальна для вашего метода.

Нельзя высмеивать статические методы.Я предполагаю, что библиотеки-макеты создают фиктивные динамически с использованием некоторых библиотек генерации байт-кода, таких как http://asm.ow2.org/index.html или http://cglib.sourceforge.net/. Структура байт-кода генерирует байт-код фиктивных классов во время выполнения.И они делают это, переопределяя методы.Но статические методы не могут быть переопределены.

Tiberiu

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