Не удается создать экземпляр класса DataAccess из-за ложного отображения преобразователя БД в модульном тесте - PullRequest
0 голосов
/ 07 января 2019

Получение ошибок при попытке проверить мой класс доступа к данным:

Причина: org.apache.ibatis.builder.BuilderException: Ошибка при разборе конфигурации SQL Mapper. Причина: org.apache.ibatis.datasource.DataSourceException

Тестовый класс:

@Tested
DataAccess dataAccess;

@Mock
Mapper mapper;

Класс DataAccess:

private Logger logger;

private final Mapper mapper;

public DataAccess() {
    String loggerCategory = new properties().getLoggerCategory();
    logger = LoggerFactory.getLogger(loggerCategory);

    mapper = DBControl.getAutoClosingMapper(
            Mapper.class, DataSource.source, logger);
}

DBControl (откуда исходит ошибка):

private static final SqlSessionFactory sqlMapper;

static {
   Reader reader = null;
   String resource = "configuration.database.xml";
   reader = Resources.getResourceAsReader(resource);

   //the exception is getting thrown from this line
   sqlMapper = new SqlSessionFactoryBuilder().build(reader);
}

Я пробовал несколько разных аннотаций mockito и jmockit в моем тестовом классе, но каждый раз у меня остается одна и та же ошибка.

Мне просто нужно издеваться над картографом.

1 Ответ

0 голосов
/ 07 января 2019

Одна вещь, которую я заметил здесь, это то, что вы используете аннотацию @Mock, чтобы попытаться смоделировать окончательную переменную класса, которая обычно не будет работать, если у вас нет конструктора где-нибудь.

, например

public class DataAccess{

   private final Mapper mapper;
   DataAccess(mapper){
    this.mapper = mapper
    // anything else
   }
}

Используя mockito, вы можете сделать что-то вроде этого:

public class TestClass{
 private DataAccess dataAccess = new DataAccess(Mockito.mock(Mapper.class));
}

Кроме того, я обычно создаю экземпляр Logger, когда вы объявляете его;

private final Logger LOGGER = LoggerFactory.getLogger(getClass());
...