我刚刚发现,在使用spock时,除了"Repository“之外,您还可以模拟所有的spring原型("Component”、"Service“和"Controller")。,原因是什么?
示例
只要"TestRepository“类具有原型注释"Repository”,下面的示例就不能工作,因为模拟的返回值是"null“。如果将原型注释更改为其他原型之一,则模拟将返回预期的"TestModel“实例。
主计长:
@Controller
class TestController {
private final TestRepository testRepository
TestController(TestRepository testRepository) {
this.testRepository = testRepository
}
@RequestMapping("/test")
String test(Model model) {
TestModel testmodel = testRepository.getTestModel()
...
}
存储库:("@Repository“不工作,"@Component","@Service”和"@Controller“工作)
@Repository
class TestRepository {
TestModel getTestModel() {...}
}
测试:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc(secure = false)
@DirtiesContext
class TestControllerSpec extends Specification {
@Autowired
MockMvc mockMvc
@Autowired
TestRepository testRepository
def "test"() {
testRepository.getTestModel >> new TestModel()
}
@TestConfiguration
static class MockConfig {
def factory = new DetachedMockFactory()
@Bean
@Primary
TestRepository testRepository() {
factory.Mock(TestRepository)
}
}
}
发布于 2018-01-10 23:55:42
有关更多详细信息,请参见史波克第758期,简而言之,@Repository
实例是在一个代理中按春季包装起来的,以处理事务,这破坏了模拟交互设置。您可以使用Spock 1.2 (目前只使用快照)和testRepository
字段上的新注释testRepository
。或者您可以使用此函数手动展开它。
public static <T> T getTargetObject(Object proxy) throws Exception {
if (AopUtils.isAopProxy(proxy)) {
return (T) ((Advised) proxy).getTargetSource().getTarget();
} else {
return (T) proxy;
}
}
def "test"() {
given:
TestRepository mock = getTargetObject(testRepository)
mock.getTestModel() >> new TestModel()
expect:
testRepository.getTestModel() != null
}
发布于 2018-05-17 19:49:47
Spock 1.2快照版本的完整源代码:
@SpringBootTest
@AutoConfigureMockMvc
class TestControllerSpec extends Specification {
@Autowired
MockMvc mockMvc
@SpringSpy
@UnwrapAopProxy
TestRepository testRepository
def "test"() {
when:
//def result = mockMvc.get(...) //implement me
then:
1 * testRepository.getTestModel >> new TestModel()
result
}
}
https://stackoverflow.com/questions/48171213
复制相似问题