首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当模拟一个spring原型"Repository“类时,Spock模拟返回null --为什么?

当模拟一个spring原型"Repository“类时,Spock模拟返回null --为什么?
EN

Stack Overflow用户
提问于 2018-01-09 15:13:14
回答 2查看 2.8K关注 0票数 6

我刚刚发现,在使用spock时,除了"Repository“之外,您还可以模拟所有的spring原型("Component”、"Service“和"Controller")。,原因是什么?

示例

只要"TestRepository“类具有原型注释"Repository”,下面的示例就不能工作,因为模拟的返回值是"null“。如果将原型注释更改为其他原型之一,则模拟将返回预期的"TestModel“实例。

主计长:

代码语言:javascript
运行
复制
@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“工作)

代码语言:javascript
运行
复制
@Repository
class TestRepository {
    TestModel getTestModel() {...}
}

测试:

代码语言:javascript
运行
复制
@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)
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-10 23:55:42

有关更多详细信息,请参见史波克第758期,简而言之,@Repository实例是在一个代理中按春季包装起来的,以处理事务,这破坏了模拟交互设置。您可以使用Spock 1.2 (目前只使用快照)和testRepository字段上的新注释testRepository。或者您可以使用此函数手动展开它。

代码语言:javascript
运行
复制
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
}
票数 8
EN

Stack Overflow用户

发布于 2018-05-17 19:49:47

Spock 1.2快照版本的完整源代码:

代码语言:javascript
运行
复制
@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
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48171213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档