#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. Нет, в тестируемом объекте