그래서 kotlin으로 작성된 아주 기본적인 모델, dao 및 컨트롤러 클래스가 있습니다. Ebean을 사용하여 서비스와 데이터를 연결하고 있습니다. 내 DAO 클래스에 대한 단위 테스트를 만들려고합니다. 내가 이해하기 위해 단위 테스트는 실제로 DB 연결을 호출해서는 안되며 일부는 내 스택을 DBUnit과 결합하여 이러한 테스트를 수행했다는 것을 읽었습니다.
그러나 Mockito로 다른 접근 방식을 선택하고 여기에 설명 된대로 수행하는 방법에 대한 ebean 지침을 따르려고했습니다. https://ebean.io/docs/setup/testing 모의 데이터베이스 개체를 만들고 다음으로 테스트를 실행할 수있었습니다. getBeanId (null) 함수 그러나 내가 변경하려고 할 때
when(dbmock.getBeanId(null)).thenReturn(someBeanId)
...에
when(dbmock.find(PracticeSession::class.java).where(Expr.eq("id", 1)).findOne()!!).thenReturn(mockPracticeSession)
이 오류가 발생합니다. java.lang.NullPointerException: Cannot invoke "io.ebean.Query.where(io.ebean.Expression)" because the return value of "io.ebean.Database.find(java.lang.Class)" is null
그래서 내가 이것을 계속해야하거나 내가 뭘 잘못하고 있는지 조언이 있습니까? 나에게 dbmock은 일부 함수 만 작동하기 때문에 실제 DB 객체와 동일하지 않은 것 같습니다. 즉, getBeanId는 작동하지만 find ()는 작동하지 않습니다. 무언가로 초기화해야합니까? DAO 클래스에서 DB.find ()가 호출 될 때도 문제가 있다고 가정합니다.
여기 내 모델이 있습니다.
import io.ebean.Model
import io.ebean.annotation.NotNull
import org.flywaydb.core.internal.configuration.ConfigUtils.TABLE
import java.util.*
import javax.persistence.*
@Entity
class PracticeSession : Model() {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long = 0
var name: String? = null
@NotNull
var date: Date? = null
@NotNull
var duration = 0
@ManyToOne(optional = false)
var location: Location? = null
@ManyToOne(optional = false)
var climber: Climber? = null
}
다오,
import io.ebean.DB
import io.ebean.Expr
import model.PracticeSession
import utils.ApplicationException
class PracticeSessionDAO {
@Throws(ApplicationException::class)
fun getPracticeSession(practice_session_id: Int): PracticeSession {
try {
return DB.find(PracticeSession::class.java).where(Expr.eq("id", practice_session_id)).findOne()!!
} catch (e:Exception){
throw ApplicationException("PracticeSession with id: $practice_session_id was not found. Returned error: $e")
}
}
}
및 테스트 클래스
package dao.sqlserver
import io.ebean.DB
import io.ebean.Database
import io.ebean.Expr
import io.ebean.MockiEbean
import model.PracticeSession
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.BeforeEach
import org.mockito.Mockito
import org.mockito.Mockito.`when`
import io.ebeaninternal.server.core.DefaultServer
import org.mockito.InjectMocks
internal class PracticeSessionDAOTestMock {
lateinit var defaultServer : Database
lateinit var restoredServer : Database
@BeforeEach
fun setUp() {
defaultServer = DB.getDefault()
assertTrue(defaultServer is DefaultServer)
}
@AfterEach
fun tearDown() {
restoredServer = DB.getDefault()
assertTrue(restoredServer is DefaultServer)
}
@Test
fun getPracticeSession() {
val dbmock = Mockito.mock(Database::class.java)
val mockPracticeSession = PracticeSession()
mockPracticeSession.id=1
`when`(dbmock.find(PracticeSession::class.java).where(Expr.eq("id", 1)).findOne()!!).thenReturn(mockPracticeSession)
//val someBeanId = java.lang.Long.valueOf(47L)
//`when`(dbmock.getBeanId(null)).thenReturn(someBeanId)
val mockiEbean = MockiEbean.start(dbmock)
try{
val mockServer = DB.getDefault()
//val beanId: Any = mockServer.getBeanId(null)
//assertEquals(someBeanId, beanId);
val practiceSessionDAO = PracticeSessionDAO()
val practiceSession = practiceSessionDAO.getPracticeSession(1)
assertEquals(1, practiceSession.id)
} finally {
mockiEbean.restoreOriginal()
}
}
}
이 문제를 해결할 수있었습니다. 이것은 올바른 방향을 가리 켰습니다 .Mockito-메서드를 스터 빙 할 때 NullpointerException
다음은 수정 된 테스트 클래스입니다. 나는 단지 많은 클래스와 함수를 모의하고 스텁해야했다.
package dao.sqlserver
import io.ebean.*
import model.PracticeSession
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.BeforeEach
import org.mockito.Mockito
import org.mockito.Mockito.`when`
import io.ebeaninternal.server.core.DefaultServer
internal class PracticeSessionDAOTestMock {
lateinit var defaultServer : Database
lateinit var restoredServer : Database
@BeforeEach
fun setUp() {
defaultServer = DB.getDefault()
assertTrue(defaultServer is DefaultServer)
}
@AfterEach
fun tearDown() {
restoredServer = DB.getDefault()
assertTrue(restoredServer is DefaultServer)
}
@Test
fun getPracticeSession() {
val dbmock = Mockito.mock(Database::class.java)
val mockPracticeSession = PracticeSession()
mockPracticeSession.id=1
val mockQuery = Mockito.mock(Query::class.java)
val mockExprFactory = Mockito.mock(ExpressionFactory::class.java)
`when`(dbmock.find(PracticeSession::class.java)).thenReturn(mockQuery as Query<PracticeSession>?)
`when`(dbmock.getExpressionFactory()).thenReturn(mockExprFactory)
`when`(mockQuery.where(mockExprFactory.eq("id",1))).thenReturn(mockQuery)
`when`(mockQuery.findOne()).thenReturn(mockPracticeSession)
val mockiEbean = MockiEbean.start(dbmock)
try{
val practiceSessionDAO = PracticeSessionDAO()
val practiceSession = practiceSessionDAO.getPracticeSession(1)
assertEquals(1, practiceSession.id)
} finally {
mockiEbean.restoreOriginal()
}
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다