当前位置: 首页 > 知识库问答 >
问题:

Spock mock在嘲笑spring原型“repository”类时返回null-为什么?

暴夕
2023-03-14

我刚刚发现,当使用spock时,除了“存储库”之外,您可以模拟所有的spring原型(“组件”、“服务”和“控制器”)。原因何在?

示例

@Controller
class TestController {

private final TestRepository testRepository

TestController(TestRepository testRepository) {
    this.testRepository = testRepository
}

@RequestMapping("/test")
String test(Model model) {
    TestModel testmodel = testRepository.getTestModel()
    ...
}
@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)
        }
    }
}

共有1个答案

柯鸿振
2023-03-14

有关更多细节,请参见Spock问题758,简而言之,@repository实例被spring包装在代理中以处理事务,这打破了模拟交互设置。您可以在testrepository字段上使用Spock1.2(目前仅使用快照)和新的注释@unwrapaopproxy。或者您也可以使用此功能手动打开它。

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
}
 类似资料:
  • 我也是Mockito和PowerMockito的新手。我发现我无法使用纯Mockito测试静态方法,因此我需要使用PowerMockito(对吗?)。 我有一个非常简单的类,名为Validate,使用这个非常简单的方法 因此,我需要验证: 1) 当我在null message参数上调用该静态方法时,将调用IllegalArgumentException。2)当我在null object参数上调用该

  • 我提到了这个答案,我该如何模拟java。时间本地日期。now()关于如何模拟我的LocalDateTime。now()调用。我基本上遵循了所有步骤,但只使用了LocalDateTime而不是LocalDate。 我的代码的功能是这样的,它应该只在一小时的第15或45分钟运行。因此,我将LOCAL\u DATE\u TIME静态变量设置为: 然后在我的@Before测试方法中,我有以下内容: 这是2

  • 运行jUnit时的异常 我想测试这个类,下面是测试方法 运行junit会产生以下异常

  • 当我试图模仿javax.ws.rs.core 时,我得到一条错误消息: 无法创建JAX-RS运行时委托 为什么会发生这种情况? 但是,当我试图嘲笑HttpServlet响应时,这是没有问题的!

  • 根据JSON规范,表示null值的正确方法是文字。 预期结果: 实际结果:

  • 问题内容: 我想用custom 创建一个Spring ,但是返回值是。参见示例: 抛出一个。在按预期的方式注入。为什么工厂退货?我该如何解决? 问题答案: 感谢Sotirios Delimanolis评论,我得出了以下解决方案: 这实际上是以下配置的简写: 工厂一直处于未完成状态,直到调用(解释)。但是,如果返回本身而不是,则无需调用它。由于该工厂是一个和Spring将调用和内部,如果需要Conv