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