Проблема if & hellip; else в тесте mockito в Spring Boot

Ваша переменная ids будет построена из «строк», а не ObjectId значений.

Мангустировать «autocasts» строковые значения для ObjectId в их правильный тип в регулярных запросах, но это не происходит в конвейере агрегации , как описано в номере № 1399.

Вместо этого вы должны выполнить правильное литье, чтобы ввести вручную:

ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) })

Затем вы можете использовать их в своем конвейере:

{ "$match": { "_id": { "$in": ids } } }

Причина в том, что конвейеры агрегации «обычно» изменяют структуру документа, и поэтому mongoose не делает никаких предположений о том, что «схема» применяется к документу на любой стадии конвейера.

Можно утверждать, что этап «первого» конвейера, когда это этап $match, должен сделать это, поскольку документ действительно не изменяется. Но сейчас это не так.

Любые значения, которые могут быть «строками» или, по крайней мере, не корректным типом BSON, должны быть вручную отобраны для соответствия.

4
задан vapurrmaid 15 January 2019 в 16:21
поделиться

1 ответ

1) Вы пишете модульный тест, а не тест на срезы или интеграционный тест. Поэтому здесь Spring Boot не имеет значения, поскольку вам не нужно загружать контейнер для проверки логики вашего компонента.
Вы можете прочитать мой вопрос / ответ об этом поле , если вы заинтересованы.

2) Ветвь (if/else) в логике означает, что у вас есть несколько сценариев.
Под разными сценариями подразумеваются, как правило, разные методы испытаний и значимые имена.
Вы также можете положиться на данную / когда / затем идиому.

3) Поскольку в вашем тесте входная информация для ветви предоставляется макетом, это также означает, что вы будете регистрировать различные варианты поведения для макета в каждом методе теста.

4) UserService не нужно издеваться. Это должно быть значение, возвращаемое макетом, а не самим макетом. Здесь вы должны издеваться над Map.

5) Вы тестируете UserFactory, поэтому вы должны назвать его UserFactoryTest.

Например:

@RunWith(MockitoJUnitRunner.class)
public class UserFactoryTest {

    @Mock
    private Map<String, User> UserMap;

    @InjectMocks
    private UserFactory UserFactory;

    private String userId = "123";


    @Test
    public void getUser(){
       when(UserMap.get(userId)).thenReturn(userService);
       userService actual = userServiceFactory.getUser(userId);
       assertEquals(UserMap.get(userId), actual);
    }


    @Test
    public void getUser_with_unknown_userId(){
        Assertions.assertThrows(IllegalArgumentException.class, 
                            ()->  userServiceFactory.getUser(userId));
    }

}

Вы замечаете, что во втором случае я не регистрирую никакого поведения для макета.
По умолчанию Mockito вернет null и на самом деле это то, что мне нужно, чтобы спровоцировать исключение. Так что все в порядке.
Также обратите внимание, что я написал утверждение, полагаясь на библиотеку JUnit 5, а не на библиотеку JUnit 4, которую вы, похоже, используете в соответствии с используемым бегуном.
Вы должны рассмотреть возможность перехода на JUnit 5 для новых тестов.

0
ответ дан davidxxx 15 January 2019 в 16:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: