如何存根 Spring 存储库以在集成测试中抛出异常?



我有一个服务,它有一个存储库作为构造函数的参数。

@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

最新更新