Kotlin在junit测试中共享了伴随对象

时间:2018-02-22 06:45:50

标签: mongodb spring-boot testing kotlin junit4

我有一个集成测试,我将嵌入式MongoDB作为伴随对象启动。我想重用这段代码,我不确定继承是否可行(如果可能的话)。

这是一个Spring Boot应用程序:

这是我的测试:

@RunWith(SpringRunner::class)
@SpringBootTest
class RequestRepositoryTest {

@Autowired lateinit var requestRepository: RequestRepository

  companion object {
    private val starter = MongodStarter.getDefaultInstance()
    private var _mongod: MongodProcess? = null
    private var _mongo: MongoClient? = null

    @BeforeClass
    @JvmStatic fun beforeTest(){
        val port = 27017
        val _mongodExe = starter.prepare(MongodConfigBuilder()
                .version(Version.Main.DEVELOPMENT)
                .net(Net("localhost", port, Network.localhostIsIPv6()))
                .build())
        _mongod = _mongodExe.start()
        _mongo = MongoClient("localhost", port)
    }

    @AfterClass
    @JvmStatic fun afterTest(){
        _mongod?.stop()
    }
  }

  @Test
  fun store() {
    val id = requestRepository.store(Request(requestId = "123"))
    assertNotNull(id)
  }

}

我的存储库类:

@Repository
class RequestRepository @Autowired constructor(val datastore: Datastore) 
{
  fun store(request : Request) : String = 
  datastore.save(request).id.toString()
}

所以我的问题是在Kotlin中采用哪种'正确'方式。

更新编辑 :作为外部对象,测试现在看起来更清晰,JUnit外部资源可以跨测试类完全重用:

谢谢@Lovis

@RunWith(SpringRunner::class)
@SpringBootTest
class RequestRepositoryTest {

  companion object {
      @ClassRule
      @JvmField
      val mongoServer = MongoServer
  }

  @Autowired lateinit var requestRepository: RequestRepository

  @Test
  fun store() {
    val id = requestRepository.store(Request(requestId = "123"))
    assertNotNull( id )
    assertTrue { ObjectId.isValid(id) }
  }

}

1 个答案:

答案 0 :(得分:2)

您应该能够使用jUnit的@ClassRuleExternalResource来实现您的目标。不需要Kotlin魔法: - )

在单独的文件中定义object

object MongoServer  : ExternalResource() {
    @Throws(Throwable::class)
    override fun before() {
        // before class
    }

    override fun after() {
       // after class
    }
}

然后在每个测试中使用它:

companion object {
    @ClassRule
    @JvmField
    val mongoServer = MongoServer
}

ClassRule注释可以解决这个问题,companion object是必要的,以使其成为静态,@JvmField注释是使字段公开所必需的。这些是jUnit规则系统的限制。