У меня есть абстрактный класс, AbstractService и несколько классов, которые проходят этот абстрактный класс:Как проверить, содержит ли общий список точный подмножество подтипа в Java?
Я тогда ServiceFactory, который возвращает меня общий список с некоторыми службами, в соответствии с параметром Переходит:
public class ServiceFactory {
public List<? extends AbstractService> getServices(final MyParameter param) {
// Service is an interface implemented by AbstractService
List<Service> services = new ArrayList<>();
for (Foo foo : param.getFoos()) {
services.add(new AService(foo.getBar()));
}
// creates the rest of the services
return services;
}
}
в моей UnitTest, я хотел бы проверить, если мой список услуг содержит ровно 3 AService подтипы. То, как я делаю это сейчас:
@Test
public void serviceFactoryShouldReturnAServiceForEachFoo() {
// I'm mocking MyParameter and Foo here
Mockito.when(param.getFoos()).thenReturn(Arrays.asList(foo, foo, foo);
AService aservice = new AService(foo);
List<AService> expectedServices = Arrays.asList(aservice, aservice, aservice);
List<? extends AbstractService> actualServices = serviceFactory.getServices();
assertTrue(CollectionUtils.isSubCollection(expectedServices, actualServices));
}
Когда actualServices содержит менее 3 AService, тест не пройден правильно. Единственная проблема с этим решением заключается в том, что если actualServices содержит более 3-х AService, тест проходит ...
Есть ли метод, который делает это, или я должен сам реализовать его с помощью петель?
Я бы использовал Set и, вероятно, проверил следующее: http://stackoverflow.com/questions/3341202/fastest-way-to-compare-two-set-in-java – shippi
Является ли ваш пример кодом правильно? Вы помещаете 3 одинаковых вещи в свой список 'expectedServices'. Вы хотите подсчитать количество разных классов в своем списке, чтобы узнать, равно ли это число? –
@DanGetz не совсем. В моем приложении я добавляю эти службы в список в соответствии с другим параметром, поэтому службы не все одинаковы, и они не всегда возвращают ровно 3. Но в моем модульном тесте я использую макетные параметры для получения ожидаемого результата , – Tarek