Модульный тест POST API в Spring-Boot + Котлин + Junit - PullRequest
0 голосов
/ 04 октября 2018

Я довольно новичок в весенних ботинках и котлин.Я начал с одного базового приложения из сети и написания юнит-теста, но получаю следующую ошибку:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: articleRepository.save(article) must not be null

Позвольте мне показать вам код: Entity Class

@Entity
data class Article (
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long = 0,

    @get: NotBlank
    val title: String = "",

    @get: NotBlank
    val content: String = ""
)

контроллер:

@PostMapping("/articles")
fun createNewArticle(@Valid @RequestBody article: Article) : Article {
    return articleRepository.save(article)
}

Репозиторий:

@Repository
interface ArticleRepository : JpaRepository<Article, Long>

Тестовый файл:

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

lateinit var mvc: MockMvc

@InjectMocks
lateinit var controller: ArticleController

@Mock
lateinit var respository: ArticleRepository

@Before
fun setup() {
    MockitoAnnotations.initMocks(this)
    mvc = MockMvcBuilders.standaloneSetup(controller).setMessageConverters(MappingJackson2HttpMessageConverter()).build()
}

@Test
fun createBlog() {
    var article = Article(1, "Test", "Test Content")
    var jsonData = jacksonObjectMapper().writeValueAsString(article)
    mvc.perform(MockMvcRequestBuilders.post("/api/articles/").contentType(MediaType.APPLICATION_JSON).content(jsonData))
            .andExpect(MockMvcResultMatchers.status().isOk)
            .andDo(MockMvcResultHandlers.print())
            .andReturn()
}
}

Когда я запускаю этот тестовый файл, появляется ошибка, упомянутая выше.Пожалуйста, помогите мне с этим.

1 Ответ

0 голосов
/ 11 октября 2018

Проблема в том, что вы ArticleRepository имитируете.

Хотя вы правильно вводите его в свой контроллер, вы не указываете, что должен возвращать вызов save.Поэтому он возвращает null, что недопустимо в Kotin, потому что вы указали его как необязательное.

Либо вы разрешаете createNewArticle вашего контроллера возвращать null, добавляя ?, чтоменяет свою подпись на

fun createNewArticle(@Valid @RequestBody article: Article) : Article? {...}

Или вы настраиваете макет так, чтобы он не возвращал null, а статью.

@Before
fun setup() {
    MockitoAnnotations.initMocks(this)
    ...
    `when`(respository.save(any())
        .thenReturn(Article()) // creates a new article
}

(В качестве альтернативы, есть также Mockito's returnsFirstArg() на тот случай, если вы не хотите вызывать строителя.)


Обратите внимание, что использование any() в этом случае будет работать только при использовании mockito-kotlin
Если вы не хотите его использовать, отметьте этот ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...