Создать подкласс из экземпляра, чтобы переопределить несколько методов? - PullRequest
0 голосов
/ 29 марта 2011

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

Есть ли способ создать объект, который является «подклассом экземпляра объекта» в том смысле, что он просто вызываетметод экземпляра для всех вызовов, за исключением случаев, когда он переопределен?

Ответы [ 3 ]

4 голосов
/ 29 марта 2011

Создайте макет с помощью какой-нибудь фреймворк-фреймворка, например Mockito :

MyComplexInterface mock = Mockito.mock(MyComplexInterface.class);
Mockito.when(mock.someMethod()).thenReturn("some value");

Mockito способен макетировать оба интерфейса и конкретные классы.

3 голосов
/ 29 марта 2011

Динамические прокси-классы может быть хорошим вариантом.Я никогда не использовал его раньше, однако это жизнеспособный механизм для перехвата каждого вызова метода и принятия решения, вызывать ли старый метод или делать что-то еще и / или дополнительно.

Ссылка, которую я предоставил, имеет даже пример DebugProxy, что может быть полезно для вас.

1 голос
/ 29 марта 2011

В целях тестирования я хочу заменить реализацию нескольких методы объекта, который реализует какой-то интерфейс.

Просто создайте класс, который расширяет текущий конкретный класс, и переопределите только те методы из интерфейса, который вы хотите протестировать.

public class ForTest extends X {

    @Override
    public void m1() { 
        .
        .
        .
    }

}

public class X implements Z{ 

//all the overrides

}

interface Z { 

//lots of methods

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