Mockito работает независимо, но работает вместе - PullRequest
1 голос
/ 01 июня 2019

Я издеваюсь над соединением jdbc, набором результатов и PreparedStatment.

Итак, когда запускаются тесты один за другим, работает.Но если запустить все тесты из класса, метод whenSelectB завершится неудачей.

java.lang.AssertionError: There are 2 rows
Expected: <2>
     but: was <0>
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
    at net.sf.jkniv.whinstone.jdbc.dml.MockitoSample.whenSelectB(MockitoSample.java:155)

Есть какой-то трюк для запуска этого?

public class MockitoSample
{        
    private DataSource        dataSource;
    private Connection        connection;
    private PreparedStatement stmt;
    private ResultSet         rs;
    private ResultSetMetaData rsMetadata;
    private DatabaseMetaData  dbMetadata;

    private RepositoryConfig  repositoryConfig;
    private SqlContext        sqlContext;
    private Selectable        sql;

    @Before
    public void setUp() throws SQLException
    {
        this.connection = mock(Connection.class);
        this.dataSource = mock(DataSource.class);
        this.stmt = mock(PreparedStatement.class);
        this.rs = mock(ResultSet.class);
        this.rsMetadata = mock(ResultSetMetaData.class);
        this.dbMetadata = mock(DatabaseMetaData.class);
        this.repositoryConfig = mock(RepositoryConfig.class);
        this.sqlContext = mock(SqlContext.class);
        this.sql = mock(Selectable.class);

        given(this.dataSource.getConnection()).willReturn(this.connection);
        given(this.connection.prepareStatement(anyString(), anyInt(), anyInt())).willReturn(this.stmt);
        given(this.stmt.executeQuery()).willReturn(this.rs);
        given(this.stmt.executeQuery(anyString())).willReturn(this.rs);
        given(this.dbMetadata.getJDBCMajorVersion()).willReturn(1);
        given(this.dbMetadata.getJDBCMinorVersion()).willReturn(0);
        given(this.dbMetadata.getDriverName()).willReturn("MOCKITO");
        given(this.dbMetadata.getDriverVersion()).willReturn("1");

        given(this.rs.getMetaData()).willReturn(this.rsMetadata);

        given(this.repositoryConfig.getName()).willReturn("Mockito");
        given(this.repositoryConfig.lookup()).willReturn(this.dataSource);
        given(this.repositoryConfig.getJndiDataSource()).willReturn("jdbc/Mockito");
        given(this.repositoryConfig.getProperty(RepositoryProperty.JDBC_ADAPTER_FACTORY.key()))
                .willReturn(DataSourceAdapter.class.getName());
        given(this.repositoryConfig.getTransactionType()).willReturn(TransactionType.LOCAL);
        given(this.repositoryConfig.getQueryNameStrategy()).willReturn("net.sf.jkniv.sqlegance.HashQueryNameStrategy");

        given(this.sql.getValidateType()).willReturn(ValidateType.NONE);
        given(this.sql.getSql(any())).willReturn("select * from dual");
        given(this.sql.getSqlDialect()).willReturn(new AnsiDialect());
        given(this.sql.getParamParser()).willReturn(ParamParserFactory.getInstance(ParamMarkType.COLON));
        given(this.sql.getStats()).willReturn(NoSqlStats.getInstance());
        given(this.sql.getSqlType()).willReturn(SqlType.SELECT);
        given(this.sql.asSelectable()).willReturn((Selectable) this.sql);

        given(this.sqlContext.getRepositoryConfig()).willReturn(this.repositoryConfig);
        given(this.sqlContext.getQuery(anyString())).willReturn(this.sql);

    }

    @Test
    public void whenSelectA() throws SQLException
    {
        Repository repository = RepositoryService.getInstance().lookup(RepositoryType.JDBC).newInstance(sqlContext);
        given(this.rsMetadata.getColumnCount()).willReturn(2);
        given(this.rsMetadata.getColumnLabel(1)).willReturn("id");
        given(this.rsMetadata.getColumnName(1)).willReturn("id");
        given(this.rsMetadata.getColumnLabel(2)).willReturn("name");
        given(this.rsMetadata.getColumnName(2)).willReturn("name");
        given(this.rs.getMetaData()).willReturn(this.rsMetadata);
        given(this.sql.getReturnType()).willReturn(FlatBook.class.getName());
        doReturn(FlatBook.class).when(this.sql).getReturnTypeAsClass();
        given(rs.next()).willReturn(true, true, false);
        given(rs.getObject(1)).willReturn(1001L, 1002L);
        given(rs.getObject(2)).willReturn("Beyond Good and Evil", "The Rebel: An Essay on Man in Revolt");

        Queryable q = QueryFactory.of("2 FlatBook");
        List<FlatBook> books = repository.list(q);
        assertThat("There are 2 rows", books.size(), equalTo(2));
        assertThat("Row is a FlatBook object", books.get(0), instanceOf(FlatBook.class));
        for (FlatBook b : books)
        {
            assertThat(b.getId(), notNullValue());
            assertThat(b.getName(), notNullValue());
        }
    }

    @Test
    public void whenSelectB() throws SQLException
    {
        Repository repository = RepositoryService.getInstance().lookup(RepositoryType.JDBC).newInstance(sqlContext);
        given(rsMetadata.getColumnCount()).willReturn(2);
        given(this.rsMetadata.getColumnLabel(1)).willReturn("id");
        given(this.rsMetadata.getColumnName(1)).willReturn("id");
        given(this.rsMetadata.getColumnLabel(2)).willReturn("name");
        given(this.rsMetadata.getColumnName(2)).willReturn("name");
        given(this.rs.getMetaData()).willReturn(this.rsMetadata);
        given(this.sql.getReturnType()).willReturn(FlatAuthor.class.getName());
        doReturn(FlatAuthor.class).when(this.sql).getReturnTypeAsClass();
        given(rs.next()).willReturn(true, true, false);
        given(rs.getObject(1)).willReturn(1L, 2L);
        given(rs.getObject(2)).willReturn("Author 1", "Author 2");

        Queryable q = QueryFactory.of("2 FlatAuthor");
        List<FlatAuthor> books = repository.list(q);
        assertThat("There are 2 rows", books.size(), equalTo(2));
        assertThat("Row is a FlatAuthor object", books.get(0), instanceOf(FlatAuthor.class));
        for (FlatAuthor a : books)
        {
            assertThat(a.getId(), notNullValue());
            assertThat(a.getName(), notNullValue());
        }
        verify(rs).close();
        verify(stmt).close();
        verify(connection, atLeast(1)).close();
    }   

Ошибка происходит внутри экземпляра Repository, он использует метод rs.next () (ResultSet), но возвращает false, когда должен возвращать true дважды.

1 Ответ

0 голосов
/ 03 июня 2019

Мой экземпляр репозитория содержит класс DataSouce в ThreadLocal, поэтому, когда whenSelectB пытается получить новый Mock, он получает старый DataSource, который получает старое Connection, который получает старый Statement, который получает старый ResultSet,Другими словами, у меня грязный контекст между тестами.Репозиторий должен удерживать соединение только в момент начала транзакции.

Спасибо @ Joakim-Danielson и @ Antoniossss

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...