Добавление @Property
в такой тестовый метод будет работать, если вы добавите список items
в свой тестовый класс. Примерно так: (я знаю, что это тест Спока, а не Котлина, но вы должны понять это.)
package com.github.wololock.micronaut.products
import io.micronaut.context.annotation.Property
import io.micronaut.test.annotation.MicronautTest
import spock.lang.Specification
@MicronautTest(environments = ["test"])
class MyTest extends Specification {
@Property(name = "items")
List<String> items
def "should use default items"() {
expect:
items == ["Item 1", "Item 2"]
}
@Property(name = "items", value = "Item 3,Item 4,Item 5")
def "should override default items"() {
expect:
items == ["Item 3", "Item 4", "Item 5"]
}
}
Однако вы используете бин SomeClass
, которыйиспользует введенные предметы. Дело в том, что когда вы вводите объект someClass
в ваш тестовый класс, бин уже создан и он неизменен. Вот почему добавление @Property
в одном из методов тестирования не приведет к реконструкции объекта bean.
package com.github.wololock.micronaut.products
import io.micronaut.context.annotation.Property
import io.micronaut.test.annotation.MicronautTest
import spock.lang.Specification
import javax.inject.Inject
@MicronautTest(environments = ["test"])
class MyTest extends Specification {
@Inject
SomeClass someClass
def "should use default items"() {
expect:
someClass.items == ["Item 1", "Item 2"]
}
@Property(name = "items", value = "Item 3,Item 4,Item 5")
def "should override default items"() {
expect:
someClass.items == ["Item 3", "Item 4", "Item 5"]
}
}
Вывод:
К счастью, есть решение этой проблемы. Вы можете использовать @MockBean
для доставки реализации SomeClass
объекта. В этом случае вы можете определить метод, который ожидает параметр @Property(name="items") List<String> items
, добавив, таким образом, аннотацию @Property
поверх тестового метода, чтобы переопределить значения, переданные методу, аннотированному @MockBean
:
package com.github.wololock.micronaut.products
import io.micronaut.context.annotation.Property
import io.micronaut.test.annotation.MicronautTest
import io.micronaut.test.annotation.MockBean
import spock.lang.Specification
import javax.inject.Inject
@MicronautTest(environments = ["test"])
class MyTest extends Specification {
@Inject
SomeClass someClass
def "should use default items"() {
expect:
someClass.items == ["Item 1", "Item 2"]
}
@Property(name = "items", value = "Item 3,Item 4,Item 5")
def "should override default items"() {
expect:
someClass.items == ["Item 3", "Item 4", "Item 5"]
}
@MockBean(SomeClass)
SomeClass someClassMock(@Property(name = "items") List<String> items) {
return new SomeClass(items)
}
}
Output:
Я использовал тесты Java и Spock Framework (Groovy) в моих примерах, но вы должны быть в состоянии достичь того же с Kotlin. Надеюсь, это поможет.