Pat*_*oos 5 unit-testing spring-mvc spock spring-boot
我刚刚发现,使用spock时你可以模拟除"Repository"之外的所有spring构造型("Component","Service"和"Controller"). 是什么原因?
示例:
只要"TestRepository"类具有构造型注释"Repository",以下示例就不起作用,因为mock的返回值为"null".如果将构造型注释更改为其他构造型之一,则mock将返回"TestModel"的预期实例.
控制器:
@Controller
class TestController {
private final TestRepository testRepository
TestController(TestRepository testRepository) {
this.testRepository = testRepository
}
@RequestMapping("/test")
String test(Model model) {
TestModel testmodel = testRepository.getTestModel()
...
}
Run Code Online (Sandbox Code Playgroud)
存储库:("@ Repository"不起作用,"@ Component","@ Service"和"@Controller"工作)
@Repository
class TestRepository {
TestModel getTestModel() {...}
}
Run Code Online (Sandbox Code Playgroud)
测试:
@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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅Spock Issue 758,在简短的@Repository
实例中,Spring会在代理中用spring来处理事务,这会破坏模拟交互设置.您可以使用Spock 1.2(仅限SNAPSHOT)和@UnwrapAopProxy
该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
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1120 次 |
最近记录: |