В Corda Enterprise 4.2 я пытаюсь завершить модульный тест, используя некоторые пользовательские таблицы JPA, и у меня возникла проблема со следующим кодом:
serviceHub = MockServices(CordaX500Name.parse("O=OOO,L=Lambari,C=BR"))
serviceHub.withEntityManager{
val entityManager = this
test = CustomJPABackedClass()
entityManager.persist(test)
}
Этот код вызывает следующее исключение:
java.lang.UnsupportedOperationException
at net.corda.testing.node.MockServices.withEntityManager(MockServices.kt:412)
at project.support.CustomSupportTest$Companion.setupTest(CustomSupportTest.kt:70)
at project.support.CustomSupportTest.setupTest(CustomSupportTest.kt)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.hibernate.testing.junit4.BeforeClassCallbackHandler.evaluate(BeforeClassCallbackHandler.java:26)
at org.hibernate.testing.junit4.AfterClassCallbackHandler.evaluate(AfterClassCallbackHandler.java:25)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Как правильно использовать этот MockServices
(или что-то еще) для создания быстрых модульных тестов?
ИЗМЕНИТЬ
После некоторых дополнительных исследований я нашел эти фрагменты кода в Corda OpenSource 4.2:
override fun jdbcSession(): Connection = throw UnsupportedOperationException()
override fun <T : Any> withEntityManager(block: EntityManager.() -> T): T {
throw UnsupportedOperationException()
}
override fun withEntityManager(block: Consumer<EntityManager>) {
throw UnsupportedOperationException()
}
Прямо сейчас я знаю, почему я получаю указанное исключение. Но остается вопрос: как мне построить модульный тест? Хотелось бы не ждать 30 секунд при создании ноды для тестов…
ИЗМЕНИТЬ
Дальнейшие исследования привели к следующему коду:
package project
import net.corda.core.identity.CordaX500Name
import net.corda.core.internal.packageName
import net.corda.nodeapi.internal.persistence.CordaPersistence
import net.corda.testing.common.internal.testNetworkParameters
import net.corda.testing.core.TestIdentity
import net.corda.testing.node.MockNetwork
import net.corda.testing.node.MockNetworkParameters
import net.corda.testing.node.MockServices
import net.corda.testing.node.internal.enclosedCordapp
import net.corda.testing.node.makeTestIdentityService
import org.junit.Before
import org.junit.Test
//import net.corda.testing.node.MockServices
class CustomTest {
val myself = TestIdentity(CordaX500Name("Me", "London", "GB"))
lateinit var mockNet: MockNetwork
lateinit var services: MockServices
lateinit var database: CordaPersistence
@Before
fun setUp() {
mockNet = MockNetwork(MockNetworkParameters(cordappsForAllNodes = listOf(enclosedCordapp())))
val (db, mockServices) = MockServices.makeTestDatabaseAndMockServices(
cordappPackages = listOf(javaClass.packageName),
identityService = makeTestIdentityService(myself.identity),
initialIdentity = myself,
networkParameters = testNetworkParameters(minimumPlatformVersion = 4)
)
services = mockServices
database = db
}
@Test
fun actualTest() {
println("mockNet : $mockNet")
println("services : $services")
println("database : $database")
}
}
И к следующему исключению:
java.lang.NoSuchMethodError: com.fasterxml.jackson.module.kotlin.KotlinModule.<init>(IZZILkotlin/jvm/internal/DefaultConstructorMarker;)V
java.lang.NoSuchMethodError: com.fasterxml.jackson.module.kotlin.KotlinModule.<init>(IZZILkotlin/jvm/internal/DefaultConstructorMarker;)V
at net.corda.client.jackson.JacksonSupport.configureMapper(JacksonSupport.kt:174)
at net.corda.client.jackson.JacksonSupport.createNonRpcMapper(JacksonSupport.kt:134)
at net.corda.client.jackson.JacksonSupport.createNonRpcMapper$default(JacksonSupport.kt:133)
at net.corda.node.services.rpc.CheckpointDumper.start(CheckpointDumper.kt:78)
at net.corda.node.internal.AbstractNode$start$8.invoke(AbstractNode.kt:425)
at net.corda.node.internal.AbstractNode$start$8.invoke(AbstractNode.kt:131)
at net.corda.nodeapi.internal.persistence.CordaPersistence.inTopLevelTransaction(CordaPersistence.kt:259)
at net.corda.nodeapi.internal.persistence.CordaPersistence.transaction(CordaPersistence.kt:235)
at net.corda.nodeapi.internal.persistence.CordaPersistence.transaction(CordaPersistence.kt:245)
at net.corda.node.internal.AbstractNode.start(AbstractNode.kt:405)
at net.corda.testing.node.internal.InternalMockNetwork$MockNode.start(InternalMockNetwork.kt:346)
at net.corda.testing.node.internal.InternalMockNetwork.createNodeImpl(InternalMockNetwork.kt:474)
at net.corda.testing.node.internal.InternalMockNetwork.createNode(InternalMockNetwork.kt:449)
at net.corda.testing.node.internal.InternalMockNetwork.createNode(InternalMockNetwork.kt:444)
at net.corda.testing.node.internal.InternalMockNetwork.createNotaries$node_driver(InternalMockNetwork.kt:253)
at net.corda.testing.node.internal.InternalMockNetwork.<init>(InternalMockNetwork.kt:236)
at net.corda.testing.node.internal.InternalMockNetwork.<init>(InternalMockNetwork.kt:149)
at net.corda.testing.node.MockNetwork.<init>(MockNetwork.kt:299)
at net.corda.testing.node.MockNetwork.<init>(MockNetwork.kt:288)
at net.corda.testing.node.MockNetwork.<init>(MockNetwork.kt:297)
at project.CustomTest.setUp(CustomTest.kt:43)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Есть мысли по этому поводу?
1 ответ
Чтобы ответить на ваш последний вопрос: как мне создать модульный тест?
Не стесняйтесь обращаться к нашим примерам модульного тестирования по адресу: здесь. а>. Мы всегда говорим о том, что разработка CorDapp основана на тестировании. В этом примере вы узнаете, как писать через тестовые случаи.
Однако, что касается вашего второго вопроса, я не думаю, что Corda в настоящее время поддерживает загрузку таблиц JPA в Mockservices
. Таким образом, вы можете загрузить любые уже существующие таблицы.
Похожие вопросы
Новые вопросы
unit-testing
Модульное тестирование - это метод, с помощью которого отдельные блоки исходного кода тестируются, чтобы определить, пригодны ли они для использования.