Kotlin - Mockito无法模拟/间谍(Spring REST API)

时间:2016-09-28 10:09:56

标签: spring unit-testing testing mocking kotlin

由于Kotlin中的所有课程默认为final,因此Mockito无法监视最终课程:

Cannot mock/spy class bye.persistence.jdbcTrial
Mockito cannot mock/spy following:
  - final classes
  - anonymous classes
  - primitive types

this guide (7月6日,Danny Preussler)说,需要一个框架来解决这个问题。

现在我想知道,是否可以测试REST API(使用Spring MockMvc)。以下是我的测试代码:

package byeTest.persistenceTest
import bye.domain.User
import bye.persistence.jdbcTrial
import bye.spring.GreetingController
import byeTest.persistenceTest.RestAPITest.RootConfig
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.BDDMockito.given
import org.mockito.Mockito
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.http.MediaType
import org.springframework.test.context.ContextConfiguration
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner
import org.springframework.test.context.web.WebAppConfiguration
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.content
import org.springframework.test.web.servlet.setup.MockMvcBuilders
import org.springframework.web.context.WebApplicationContext

@RunWith(SpringJUnit4ClassRunner::class)
@ContextConfiguration(classes = arrayOf(RootConfig::class))
@WebAppConfiguration
open class RestAPITest {
    var mockMvc: MockMvc? = null;

    @Autowired
    var wac : WebApplicationContext? = null;

    @Autowired
    var jdbcTrial : jdbcTrial? = null

    @Autowired
    var todoServiceMock : GreetingController? = null;

    @Before
    open fun setup(){
        mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build()
        given(this.jdbcTrial?.getUserById(2)).willReturn(User(2,"uname","typ"));

    }



    @Test
    open public fun find_2(){
        mockMvc!!.perform(get("/user/2").accept(MediaType.APPLICATION_JSON))

            .andExpect(content().string("{\"id\":2,\"username\":\"uname\",\"usertype\":\"typ\"}"))


    }

    @Configuration
    open class RootConfig{
        @Bean
        open fun jdbcTrial():jdbcTrial{
            return Mockito.mock(jdbcTrial::class.java)
        }
    }
}

我将所有使用的函数和类设置为open,因为根据kotlin docs,这与final完全相反。但是使用它(无处不在)仍然会引发上述异常。

import bye.domain.Comment
import bye.domain.Event
import bye.domain.Participant
import bye.domain.User
import java.sql.Connection
import java.sql.DriverManager
import java.sql.ResultSet
import java.sql.Statement
import java.util.ArrayList
import javax.sql.DataSource

open class jdbcTrial() {
    open var url: String = "jdbc:postgresql://rosdel.quintor.local:5432/quintorevents"
    //val props: Properties = Properties();

    open var DB_DRIVER = "org.postgresql.Driver";
    open var dataSource:String? = "b";

    constructor(s : String):this(){
        this.dataSource = s
    }

    open fun getFoo():String{
        var query : String = "select val_col from foo_tbl where key_col = 'foo';"
        var rs:ResultSet = this.getConnection().createStatement().executeQuery(query)
        var result:String = "wrong";
        while(rs.next()){
            result= rs.getString("val_col")
        }
        return result;
    }

    open fun getBaz():String{
        return "qux"
    }

    // /events
    open fun getAll(): List<Event> {
        return getMultipleEvents("select * from quintor_event;")
    }

    // /events/search
    open fun searchEvents(search: String): List<Event> {
        var query = "select * from quintor_event where title LIKE '%" + search + "%';"
        return getMultipleEvents(query)
    }

    // used for getting the comments
    open fun getUserById(id: Int): User {
        var query = "select * from quintor_user where id = ${id};";
        return getSingleUser(query)
    }
    ........

1 个答案:

答案 0 :(得分:0)

关于kotlin中的模拟最终课程–您可以使用mockito kotlin库。它可以在github上找到。在此链接https://hadihariri.com/2016/10/04/Mocking-Kotlin-With-Mockito/中,您可以找到操作方法。我每天都在使用它,我也从春季开始使用mockmvc,而且效果很好。