Сделать Service test для возврата отфильтрованного списка, как это сделать, когда входным параметром является id? - PullRequest
0 голосов
/ 07 марта 2020

У меня есть класс Service, содержащий этот метод:

public List<Tag> getSegmentByTypeSaved(String mailChimpListId) {

        List<Tag> tags = mailChimpClient.listTags(mailChimpListId);

        List<Tag> listOfSegmentsByTypeSaved = tags.stream()
                .filter(x -> x.getType().equals(TagType.SAVED))
                .map(y -> new Tag(y.getId(), y.getName(), y.getUpdatedAt(), y.getMemberCount(), y.getType()))
                .sorted(Comparator.comparing(Tag::getUpdatedAt).reversed())
                .collect(Collectors.toList());

        return listOfSegmentsByTypeSaved;
    }

Я хочу создать тест, чтобы проверить, работает ли сервис так, как я хочу. Класс тестирования до сих пор:

@Test
    public void getFiltredListByTypeSaved() {

        Tag tagOne = new Tag(1, "Test One", LocalDate.now().minusDays(2).toString(), 5, TagType.SAVED);
        Tag tagTwo = new Tag(2, "Test Two", LocalDate.now().minusDays(5).toString(), 5, TagType.STATIC);

        List<Tag> tags = new ArrayList<>();
        tags.add(tagOne);
        tags.add(tagTwo);

        // Check if list has size of two after filtered

       // Check if list have the properties as above only for SAVED

       // Check if list if sorted by attribute eg: LocalDate

Как я могу издеваться, чтобы служба фактически возвращала мне отфильтрованный список? Мой метод класса Service принимает идентификатор в качестве входного параметра. Эта строка кода в классе обслуживания List<Tag> tags = mailChimpClient.listTags(mailChimpListId); возвращает мне список tags с другим объектом, содержащим типы «сохраненный» и «stati c». Но в моем тесте я хочу проверить, что я получаю список только TagType.SAVED.

Мой MailChimpService класс:

@Inject
public MailChimpService(MailChimpClient mailChimpClient,
                        MailChimpRepository mailChimpRepository,
                        ProductService productService,
                        SchoolService schoolService,
                        SchoolYearService schoolYearService,
                        SchoolYearConfigService schoolYearConfigService,
                        @Value("${mailchimp.customer.list}") String mailChimpCustomerListId,
                        @Value("${mailchimp.customer.smspermission}") String mailChimpCustomerSmsPermission,
                        @Value("${mailchimp.customer.emailpermission}") String mailChimpCustomerEmailPermission,
                        @Value("${mailchimp.schooladmin.list}") String mailChimpSchoolAdminListId,
                        @Value("${mailchimp.schooladmin.smspermission}") String mailChimpSchoolAdminSmsPermission,
                        @Value("${mailchimp.schooladmin.emailpermission}") String mailChimpSchoolAdminEmailPermission
) {
    this.mailChimpClient = mailChimpClient;
    this.mailChimpRepository = mailChimpRepository;
    this.productService = productService;
    this.schoolService = schoolService;
    this.schoolYearService = schoolYearService;
    this.schoolYearConfigService = schoolYearConfigService;
    this.mailChimpCustomerListId = mailChimpCustomerListId;
    this.mailChimpCustomerEmailPermission = mailChimpCustomerEmailPermission;
    this.mailChimpCustomerSmsPermission = mailChimpCustomerSmsPermission;
    this.mailChimpSchoolAdminListId = mailChimpSchoolAdminListId;
    this.mailChimpSchoolAdminEmailPermission = mailChimpSchoolAdminEmailPermission;
    this.mailChimpSchoolAdminSmsPermission = mailChimpSchoolAdminSmsPermission;
}

Есть идеи?

Спасибо!

1 Ответ

0 голосов
/ 07 марта 2020

Итак, как вы уже упоминали, MailChimpClient возвращает список смешанных типов тегов, а ваш сервисный метод отфильтровывает их. Это именно то, что вы должны делать со своим тестом. Я просто высмеивал MailChimpClient и возвращал список смешанных элементов Tag при вызове.

class FooServiceTest {

    @Mock
    private MailChimpClient mailChimpClient;

    private FooService fooService;

    @BeforeEach
    void setUp() {
        MockitoAnnotations.initMocks(this);
        this.fooService = new FooService(mailChimpClient);
    }

    @Test
    void getFilteredListByTypeSaved() {
        String mailChimpListId = "id";

        final List<Tag> tags = List.of(
                new Tag(1, "Test One", LocalDate.now().minusDays(2).toString(), 5, TagType.SAVED),
                new Tag(2, "Test Two", LocalDate.now().minusDays(5).toString(), 5, TagType.STATIC),
                new Tag(1, "Test Three", LocalDate.now().minusDays(2).toString(), 5, TagType.SAVED),
                new Tag(2, "Test Four", LocalDate.now().minusDays(5).toString(), 5, TagType.STATIC),
                new Tag(1, "Test Five", LocalDate.now().minusDays(2).toString(), 5, TagType.SAVED),
                new Tag(2, "Test Six", LocalDate.now().minusDays(5).toString(), 5, TagType.STATIC)
        );
        // mocking the class to return a list of tags when invoked
        Mockito.when(mailChimpClient.listTags(mailChimpListId))
                .thenReturn(tags);

        // actual invocation
        final List<Tag> result = fooService.getSegmentByTypeSaved(mailChimpListId);

        // assertions
        // assert the actual size of the result
        Assertions.assertNotNull(result);
        Assertions.assertEquals(3, result.size());
        // assertions related to the actual content of the result
        final Set<TagType> typeSet = result.stream().map(Tag::getType).collect(Collectors.toSet());

        Assertions.assertEquals(1, typeSet.size());
        Assertions.assertEquals(TagType.SAVED, typeSet.iterator().next());

        Mockito.verify(mailChimpClient, Mockito.times(1)).listTags(eq(mailChimpListId));
    }
}
...