我有一个服务,它有一个存储库作为构造函数的参数。
@Autowired
NodeServiceListInstallService( final BykiListRepository aBykiListRepository )
BykiListRepository
是默认的 Spring 存储库,没有实现
interface BykiListRepository extends JpaRepository<BykiList, Long> {
//some magic methods
}
我的配置类标有@EnableJpaRepositories
,所以,我没有直接 Bean 的声明。服务声明:
@SpringBootApplication
@EnableConfigurationProperties( ApplicationProperties )
@EnableJpaRepositories
@EnableTransactionManagement
@ImportResource( 'classpath:META-INF/spring/application-context.xml' )
class Application extends SpringBootServletInitializer {
@Bean
NodeServiceListInstallService nodeServiceListInstallService( final BykiListRepository bykiListRepository ) {
new NodeServiceListInstallService( bykiListRepository )
}
}
我正在尝试在存储库方法的调用中编写一个测试save
这将引发异常PersistenceException
. 我尝试存根/监视一个存储库并将其声明为与@Primary
@TestConfiguration
的 bean,甚至实现接口。 但我没有得到结果。
@TestConfiguration
class TestConfig {
@Bean
BykiListRepository bykiListRepository() {
//return Spock's Spy/Stub or new BykiRepositoryBadImpl()
}
测试:
@ContextConfiguration( classes = TestConfig )
class GlobalErrorHandlerIntegrationTest extends BaseFlowIntegrationTest {
//test()
}
我在Groovy-2.4.12
上写,用Spock-1.1
写测试.Spring Boot 1.5.4
. 保留的变体是使用方面,但并不是我想要的。 将非常感谢帮助。
更新:DetachedMockFactory
的用法:
配置:
@TestConfiguration
class DummyConfiguration {
private final detachedFactory = new DetachedMockFactory()
@Bean
@Primary
BykiListRepository bykiListRepository() {
detachedFactory.Mock( BykiListRepository )
}
}
测试的骨架:
@SpringBootTest( classes = DummyConfiguration )
@Import( [DummyConfiguration] )
@ContextConfiguration( classes = DummyConfiguration )
class GlobalErrorHandlerIntegrationTest extends BaseFlowIntegrationTest {
@Autowired
BykiListRepository bykiListRepositoryMock
def 'exercise error handling'() {
given: 'the failing repository'
bykiListRepositoryMock.save( _ ) >> {
throw new CannotCreateTransactionException()
}
when: 'the message is send to rabbit'
rabbitOperations.send( configuration.rabbitExchangeName, '', msg )
}
}
哪里:
@SpringBootTest( webEnvironment = SpringBootTest.WebEnvironment.NONE )
@ContextConfiguration( classes = Application )
class BaseFlowIntegrationTest extends AbstractIntegrationTest {...}
和
@Category( InboundIntegrationTest )
abstract class AbstractIntegrationTest extends Specification {...}
你可以像下面这样创建test configuration
,并在调用某个函数时使用 Spock 记录,然后 ex 将被抛出。当然,在测试课中使用@Inject or @Autowire
...并做@Import([IntegrationTestMockingConfig])
@TestConfiguration
class IntegrationTestMockingConfig {
private DetachedMockFactory factory = new DetachedMockFactory()
@Bean
ExternalRepository externalRepository() {
factory.Mock(ExternalRepository)
}
}
问题是因为我的豆名错误。我已将其更改为bykiListRepositoryMock
(而不是bykiListRepository
(,并且解决了问题。
如果你想使用模拟的存储库抛出异常 -
when(repository.yourMethodName(anyString(), anyString(), anyString())).thenThrow(new PersistenceException("Persistence exception occurred"));
如果要抛出任何特定的持久性异常,也可以抛出。 https://www.objectdb.com/api/java/jpa/exceptions