Я пишу тесты для личного проекта (на Java17 с использованием JUnit5/Jupiter и Google Truth), где использую множественное наследование интерфейсов для определения классов. Например:
Пример
Код: Выделить всё
public interface Taggable {
public String getTagName();
public String getSimpleContent();
// ... and more
}
public interface CreatureContainer {
public Collection getCreatures();
public boolean addCreature(Creature c);
public void announce(String message);
// ... and more
}
public class Area implements Taggable, CreatureContainer { // possibly more
private String name;
private Set creatures;
// Constructor etc
@Override
public String getTagName() {
return this.getClass().getName();
}
@Override
public String getSimpleContent() {
return this.name;
}
@Override
public Collection getCreatures() {
return creatures;
}
// ...etc
}
Поскольку класс субъекта Google Truth представляет собой КЛАСС и нет интерфейсов, которые можно было бы использовать для отражения моей структуры, я не могу написать что-то вроде:< /p>
Код: Выделить всё
public class TaggableSubject extends Subject {};
public class CreatureContainerSubject extends Subject {};
public class AreaSubject extends TaggableSubject, CreatureContainerSubject {}; // ERROR!!
Вариант 1
Я пишу одну тему для каждого из тегов, CreatureContainer и Area. В AreaSubject я включаю такие методы, как
Код: Выделить всё
public TaggableSubject asTaggable() {
return check("this").that(actual); // just give it a raw actual?
}
public CreatureContainerSubject asCreatureContainer() {
return check("this").that(actual);
}
Я пишу только AreaSubject и включаю метод для каждой вещи из унаследованных интерфейсов.
Например:
Код: Выделить всё
public StringSubject tagName() {
return check("getTagName()").that(actual.getTagName());
}
// or similarly
public void hasTagName(String tagName) {
this.tagName().isEqualTo(tagName);
}
public void hasCreature(Creature c) {
check("getCreatures()").that(actual.getCreatures()).contains(c);
}
Чтобы двигаться дальше, я выберу первый вариант, но мне все равно хотелось бы знать:< /p>
Какой из вариантов больше соответствует парадигме Google Truth? Или есть лучший вариант?
Спасибо.
Подробнее здесь: https://stackoverflow.com/questions/785 ... uses-inter