Как имитировать запрос внутри функции с помощью Mockito

#java #mongodb #maven #junit #mockito

#java #mongodb #maven #junit #mockito

Вопрос:

Я пишу тест Junit, но часть теста зависит от конкретных данных из базы данных, поэтому мой план состоит в том, чтобы использовать Mockito, чтобы не зависеть от базы данных, но у меня возникли проблемы с некоторыми функциями, которые содержат запросы, используя MongoMorphia.

Это и есть испытание:

 @Test
    public void testExceptionIDisValid() throws BusinessException {
        Receptor = new Receptor();
        receptor.setTipoEspecial(null);
        receptor.setIDReceptor("12521357");
        validationIDReceiver.validateReceiver(receptor);
    } 
 

Функция:

 private static Datastore datastore = MongoMorphia.getDatastore();

public void validateReceiver(Receptor receiver) throws BusinessException {
        if (!receiver.getIDReceptor().equals("CF")) {
            final Query<MiniRTU> query = datastore.find(MiniRTU.class).filter("nit", receiver.getIDReceptor());
            Optional<MiniRTU> result = Optional.ofNullable(query.get());
            if (result.isEmpty()) {
                throw new BusinessException(NIT_RECEIVER_INVALID);
            }
        }
}
 

Я пытаюсь сделать что-то подобное с mockito:

 public class TestIDReceiver {

    private IngestorConfiguration configuration;
    private ValidationIDReceiver validationIDReceiver;
    Datastore ds = mock(Datastore.class);
    private static final String nit = "12521357";

    @Before
    public void setup() throws IOException, ConfigurationException, Exception {
        final ObjectMapper objectMapper = Jackson.newObjectMapper();
        final Validator validator = Validators.newValidator();
        final YamlConfigurationFactory<IngestorConfiguration> factory = new YamlConfigurationFactory<>(IngestorConfiguration.class, validator, objectMapper, "dw");
        final File yaml = new File(Thread.currentThread().getContextClassLoader().getResource("config.yml").getPath());
        configuration = factory.build(yaml);
        MongoMorphia.create(configuration);
        validationIDReceiver = ValidationIDReceiver.getInstance(configuration);
    }

    @Test
    public void testExceptionIDNitIsValid() throws BusinessException {
        Receptor receptor = new Receptor();
        FieldEnd fieldEnd = mock(FieldEnd.class);
        MiniRTU mini = new MiniRTU();
        mini.setNit(nit);
        receptor.setTipoEspecial(null);
        receptor.setIDReceptor("12521357");
        Query<MiniRTU> q = mock(Query.class);
        
        when(fieldEnd.equal(receptor)).thenReturn(q);
        when(q.get()).thenReturn(mini);
        when(ds.find(MiniRTU.class)).thenReturn(q);
        when(ds.find(MiniRTU.class).field("nit")).thenReturn(fieldEnd);
        when(fieldEnd.exists()).thenReturn(receptor);
//        when(ds.find(MiniRTU.class)).thenReturn(q);
//        when(ds.find(MiniRTU.class).field("nit")).thenReturn(fieldEnd);
//        when(ds.find(MiniRTU.class).field("nit").equal(mini)).thenReturn(q);
//        when(q.get()).thenReturn(mini);
//        when(ds.find(MiniRTU.class).field("nit")).thenReturn(q);
        validationIDReceiver.validateReceiver(receptor);
    }

}
 

Я оставил прокомментированную часть, потому что это то, с чем я тоже пробовал.

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

 final Query<MiniRTU> query = datastore.find(MiniRTU.class).filter("nit", receiver.getIDReceptor());
            Optional<MiniRTU> result = Optional.ofNullable(query.get());
 

Но до сих пор с тем, что я пробовал, он не отправляет никаких данных, только null, поэтому в функции он переходит к части if (result.isEmpty()) и выдает исключение. Есть какие — нибудь идеи о том, что я могу сделать?

Комментарии:

1. Вы издевались над классом хранилища данных, но тестируемый объект его не использует — он использует свое частное статическое поле. Избавьтесь от static, используйте поле экземпляра, инициализированное в конструкторе, передайте макет конструктору.

2. @Lesiak спасибо за ответ, уже удалил статику private Datastore datastore = MongoMorphia.getDatastore(); , поэтому у меня есть это в функции (функция находится внутри вызова класса validationIDReceiver) какой конструктор вы имеете в виду в тесте?

3. Нет, в тестируемом объекте