Kotlin – Mockito не может издеваться / шпионить (Spring REST API)

Поскольку все классы в Котлине по умолчанию final , а Mockito не может следить за финальными классами:

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

И это руководство (6 июля, Дэнни Прейсслер) говорит, что для решения этой проблемы необходима структура.

Теперь мне было интересно, можно ли тестировать 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 поскольку согласно котлинским документам это полная противоположность 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) } ........ в 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) } ........