【问题标题】:How To Test Object expression methods by mocking external dependency which its mothod is using?如何通过模拟其方法使用的外部依赖项来测试对象表达式方法?
【发布时间】:2021-07-02 08:14:34
【问题描述】:

在编写单元测试时,@InjectMock 创建一个类的实例并注入使用@Mock 定义的模拟实例。

所以当我们测试一个类的方法时,这很好用。 我在测试对象表达式的方法时遇到问题。

例如: 我有一个对象类 DbService。

object DbService {
    private lateinit var connection: Connection
    init {
        makeConnection()
    }
    private fun makeConnection(){
        Class.forName("com.mysql.cj.jdbc.Driver")
        try{
            connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/Users", "user", "password")
        }catch (ex: Exception){
            println(ex)
        }
    }

    fun checkConnection(){
        var preparedStatement: PreparedStatement = connection.prepareStatement("SHOW DATABASES;")
        var resultSet = preparedStatement.executeQuery()
        while(resultSet.next()){
            println(resultSet.getObject(1))
        }
    }
}

现在我必须测试checkConnection 功能。我该怎么做?

【问题讨论】:

    标签: unit-testing kotlin mockito mockk


    【解决方案1】:

    实际上做了更多的研究,我得到了一些提示,它对我有用。

    就像,你可以使用 setter 方法进行手动依赖注入。

    setter-based Dependency Injection

    所以我做了什么,我又添加了一个函数来像这样手动设置连接对象。

    object DbService {
        private lateinit var connection: Connection
        init {
            makeConnection()
        }
        private fun makeConnection(){
            Class.forName("com.mysql.cj.jdbc.Driver")
            try{
                connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/Users", "user", "password")
            }catch (ex: Exception){
                println(ex)
            }
        }
        
        // setter based dependency injection            <----
        fun initializeConnectionObject(conn: Connection){
            connection = conn
        }
    
        fun printingSomeMoreData(){
            var statement: Statement
            var resultSet: ResultSet
            var preparedStatement: PreparedStatement = connection.prepareStatement("SELECT * FROM titles where title=?;")
            preparedStatement.setString(1, "Engineer")
            resultSet = preparedStatement.executeQuery()
            val columnCount = resultSet.metaData.columnCount
            while(resultSet.next()){
                for(i in 1..columnCount){
                    print(resultSet.getObject(i).toString() + " ")
                }
                println()
            }
        }
    
    }
    

    测试如下:

        @RunWith(MockitoJUnitRunner::class)
        class DbServiceTest {
    
        private lateinit var dbService: DbService
        @Mock lateinit var mockedConnection: Connection
        @Mock lateinit var mockedPreparedStatement: PreparedStatement
        @Mock lateinit var mockedResultSet: ResultSet
        @Mock
        lateinit var mockedResultSetMetaData: ResultSetMetaData
    
        @Before
        fun setUp(){
            MockitoAnnotations.initMocks(true)
        }
    
        @Test
        fun printingSomeMoreDataTest() {
            dbService = DbService
            Mockito.`when`(mockedResultSetMetaData.columnCount).thenReturn(3)
            Mockito.`when`(mockedResultSet.next()).thenReturn(true, true, true, true, false)
            Mockito.`when`(mockedResultSet.metaData).thenReturn(mockedResultSetMetaData)
            Mockito.`when`(mockedResultSet.getObject(1)).thenReturn("11", "21", "31", "41")
            Mockito.`when`(mockedResultSet.getObject(2)).thenReturn("12", "22", "32", "42")
            Mockito.`when`(mockedResultSet.getObject(3)).thenReturn("13", "23", "33", "43")
            Mockito.`when`(mockedPreparedStatement.executeQuery()).thenReturn(mockedResultSet)
            Mockito.`when`(mockedConnection.prepareStatement(Mockito.anyString())).thenReturn(mockedPreparedStatement)
            dbService.initializeConnectionObject(mockedConnection)      // <----
            dbService.printingSomeMoreData()
            Mockito.verify(mockedResultSet, times(12)).getObject(anyInt())
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 2021-04-12
      • 2014-03-26
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多