mockito.jpg
前两篇文章的主要内容是:为了给执行测试,如何建立数据库表和导入初始数据。这里我们将学习如何利用Mockito框架和一些注解模拟(mock)Repository实例,从而使得测试用例不依赖外部的数据库服务。
我们需要创建一个Spring Boot配置类,在该类中定义用于测试的Spring Bean;我们通过注解指示Spring Boot何时加载测试配置类以及何时执行该类中的代码。在改配置类中,我们将使用Mockito框架创建一些带预定义方法的mock对象,Spring Boot在执行测试用例之前会将这些对象织入。
@Configuration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = @ComponentScan.Filter(UsedForTesting.class))
@EnableScheduling
public class BookPubApplication {
public static void main(String[] args) {
SpringApplication.run(BookPubApplication.class, args);
}
@Bean
public StartupRunner schedulerRunner() {
return new StartupRunner();
}
}
@interface UsedForTesting {}
package com.test.bookpub;
import com.test.bookpub.repository.PublisherRepository;
import org.mockito.Mockito;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Configuration
@UsedForTesting
public class TestMockBeansConfig {
@Bean
@Primary
public PublisherRepository createMockPublisherRepository() {
return Mockito.mock(PublisherRepository.class);
}
}
package com.test.bookpub;
import com.test.bookpub.repository.PublisherRepository;
import org.junit.After;import org.junit.Before;import org.junit.Test;
import org.junit.runner.RunWith;import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.IntegrationTest;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.assertEquals;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {
BookPubApplication.class,
TestMockBeansConfig.class
})
@IntegrationTest
public class PublisherRepositoryTests {
@Autowired
private PublisherRepository repository;
@Before
public void setupPublisherRepositoryMock() {
Mockito.when(repository.count())
.thenReturn(1L);
}
@Test
public void publishersExist() {
assertEquals(1, repository.count());
}
@After
public void resetPublisherRepositoryMock() {
Mockito.reset(repository);
}
}
OK,分析下刚刚发生了什么。首先,我们从对BookPubApplication.java的修改开始:
接下来看看在TestMockBeansConfig中的操作,
最后看下我们的测试用例,主要关注setupPublisherRepositoryMock方法和resetPublisherRepositoryMock方法: