Другим подходом может быть улучшение вашего дизайна :
В вашем случае оба проекта используют один и тот же базовый класс.Вы можете применить подход Favor Composition к наследованию , превратив Context
в обычный класс (удалив ключевое слово abstract
) и переместив его в общий базовый проект.Таким образом, у вас есть единственная точка, в которой вы тестируете поведение Context
.
Ваши специализированные классы ContextA
и ContextB
получат экземпляр Context
, внедренный в качестве параметра конструктора, чтобы вы могли имитироватьв своих собственных тестах.
interface Context {
public void dispose();
}
class ContextImpl implements Context {
@Override
public void dispose() {
...
}
}
class ContextA implements Context {
private final Context common;
ContextA(@Inject Context common){
this.common = common;
@Override
public void dispose() {
common.dispose();
}
}
class ContextB implements Context {
private final Context common;
ContextB(@Inject Context common){
this.common = common;
@Override
public void dispose() {
common.dispose();
}
}
Затем вы проверяете (наряду со специальным поведением ContextA
и ContextB
соответственно), что ожидаемые методы в переданном экземпляре Context
вызываются.
Да, у вас все еще есть дублированный тест, но он настолько прост, что никогда не изменится, пока сигнатуры методов в Context
не изменятся.
иногда это может быть даже лучшесделать это наоборот и внедрить специализированные реализации в класс, содержащий общее поведение ...