Unit testing 使用spring boot、kotlin和junit进行Rest控制器单元测试
我目前正在用SpringBoot开发一个网站,kotlin,在那里我试图阅读xml格式的GoogleTrendsRSS提要,并将其解析为Json。 我想添加单元测试来测试我的控制器,但我不知道到底要测试什么 这是我的数据类:Unit testing 使用spring boot、kotlin和junit进行Rest控制器单元测试,unit-testing,spring-boot,junit,kotlin,spring-restcontroller,Unit Testing,Spring Boot,Junit,Kotlin,Spring Restcontroller,我目前正在用SpringBoot开发一个网站,kotlin,在那里我试图阅读xml格式的GoogleTrendsRSS提要,并将其解析为Json。 我想添加单元测试来测试我的控制器,但我不知道到底要测试什么 这是我的数据类: data class Rss ( val title: String, val source: String, val image: String, val description: String, val url: String
data class Rss (
val title: String,
val source: String,
val image: String,
val description: String,
val url: String
)
这是我的休息控制器
@RestController
@RequestMapping(value="/rss")
class RssRestService {
@GetMapping(value = "/list/item")
@CrossOrigin("http://localhost:3000")
fun rss(): List<Rss>? {
val url = "https://trends.google.fr/trends/hottrends/atom/feed?pn=p1"
val reader = XmlReader(URL(url))
val feed: SyndFeed = SyndFeedInput().build(reader)
return feed.entries.subList(1,6)
.map { entry -> Rss(
title = entry.title,
image = entry.foreignMarkup[1].content[0].value.substring(2),
source = entry.foreignMarkup[2].content[0].value,
description = entry.foreignMarkup[3].content[1].value.toString(),
url = entry.foreignMarkup[3].content[1].value
) }
}
我的问题是:我应该测试什么?如何测试输出是否为写 对控制器进行单元测试非常困难,因为它依赖于外部URL来检索新闻提要的详细信息
我会将与外部URL的交互提取到一个单独的服务中,然后将此服务自动连接到您的控制器中。这将允许yopu在控制器的单元测试中使用此服务的模拟实现,然后您可以注入已知的提要项,并确保控制器的响应是正确的。我将控制器与服务分离: RestController:
@RestController
@RequestMapping(value="/rss")
class RssRestService {
@Autowired
lateinit var rssService: RssService
@GetMapping(value = "/list/item")
@CrossOrigin("http://localhost:3000")
fun rss(): List<Rss>? {
val url = "https://trends.google.fr/trends/hottrends/atom/feed?pn=p1"
return rssService.getListRss(url)
}
@RestController
@请求映射(value=“/rss”)
RssRestService类{
@自动连线
lateinit var rssService:rssService
@GetMapping(value=“/list/item”)
@交叉原点(“http://localhost:3000")
有趣的rss():列表{
val url=”https://trends.google.fr/trends/hottrends/atom/feed?pn=p1"
返回rssService.getListRss(url)
}
我的服务
@Component
class RssService{
fun getListRss(url: String): List<Rss> {
val reader = XmlReader(URL(url))
val feed: SyndFeed = SyndFeedInput().build(reader)
return feed.entries.subList(1,6)
.map { entry -> Rss(
title = entry.title,
image = entry.foreignMarkup[1].content[0].value,
source = entry.foreignMarkup[2].content[0].value,
description = entry.foreignMarkup[3].content[1].value.toString(),
url = entry.foreignMarkup[3].content[5].value
) }
}
@组件
RSS类服务{
趣味getListRss(url:String):列表{
val reader=XmlReader(URL(URL))
val feed:SyndFeed=SyndFeedInput().build(读取器)
返回提要.条目.子列表(1,6)
.map{entry->Rss(
title=entry.title,
image=entry.foreignMarkup[1]。内容[0]。值,
source=entry.foreignMarkup[2]。内容[0]。值,
description=entry.foreignMarkup[3]。内容[1]。值。toString(),
url=entry.foreignMarkup[3]。内容[5]。值
) }
}
然后为了进行测试,我用静态rss源创建了一个文件,并将其路径作为url传递
@Test
fun listItemTest() {
val result = rssService.getListRss("file:///Home/iroolApp/src/test/kotlin/com/iroolapp/demo/feeds")
Assert.assertEquals("Iran Nuclear Deal", result[0].title)
Assert.assertEquals("//t0.gstatic.com/images?q=tbn:ANd9GcTbU16JklJB3H_Ib3dUeu03_4HQPABuE8EthZQRUEG6JMFyDHYytTn-9wexe3E2yYOKO1K9c0Fl", result[0].image)
Assert.assertEquals("New York Times", result[0].source)
Assert.assertEquals("Trump Withdraws US From 'One-Sided' <b>Iran Nuclear Deal</b>", result[0].description)
Assert.assertEquals("https://www.nytimes.com/2018/05/08/world/middleeast/trump-iran-nuclear-deal.html", result[0].url)
}
@测试
趣味listItemTest(){
val result=rssService.getListRss(“file:///Home/iroolApp/src/test/kotlin/com/iroolapp/demo/feeds")
Assert.assertEquals(“伊朗核协议”,结果[0]。标题)
Assert.assertEquals(//t0.gstatic.com/images?q=tbn:and 9gctbu16jkljb3h_ib3due03_4hqpabue8ethzqrueg6jmfydhyttn-9wexe3E2yYOKO1K9c0Fl),结果[0]。图像)
Assert.assertEquals(“纽约时报”,结果[0]。来源)
Assert.assertEquals(“特朗普让我们退出伊朗核协议”,结果[0]。描述)
Assert.assertEquals(“https://www.nytimes.com/2018/05/08/world/middleeast/trump-iran-nuclear-deal.html,结果[0]。url)
}
因此,传递包含提要的本地路径的文件是否正确?这似乎是一种合理的方法,因为它为您提供了一致且可重复的测试用例。
@Test
fun listItemTest() {
val result = rssService.getListRss("file:///Home/iroolApp/src/test/kotlin/com/iroolapp/demo/feeds")
Assert.assertEquals("Iran Nuclear Deal", result[0].title)
Assert.assertEquals("//t0.gstatic.com/images?q=tbn:ANd9GcTbU16JklJB3H_Ib3dUeu03_4HQPABuE8EthZQRUEG6JMFyDHYytTn-9wexe3E2yYOKO1K9c0Fl", result[0].image)
Assert.assertEquals("New York Times", result[0].source)
Assert.assertEquals("Trump Withdraws US From 'One-Sided' <b>Iran Nuclear Deal</b>", result[0].description)
Assert.assertEquals("https://www.nytimes.com/2018/05/08/world/middleeast/trump-iran-nuclear-deal.html", result[0].url)
}