Xel*_*ian 13 java xml spring spring-mvc autowired
我有一个Spring应用程序,在其中我不使用xml配置,只使用Java Condfig.一切都还可以,但是当我尝试测试时,我遇到了在测试中启用组件的问题.所以让我们开始我有一个界面
@Repository
public interface ArticleRepository extends CrudRepository<Page, Long> {
Article findByLink(String name);
void delete(Page page);
}
Run Code Online (Sandbox Code Playgroud)
和组件/服务
@Service
public class ArticleServiceImpl implements ArticleService {
@Autowired
private ArticleRepository articleRepository;
...
}
Run Code Online (Sandbox Code Playgroud)
我不想使用xml配置,因此对于我的测试,我尝试仅使用Java配置测试ArticleServiceImpl.所以为了测试目的,我做了:
@Configuration
@ComponentScan(basePackages = {"com.example.core", "com.example.repository"})
public class PagesTestConfiguration {
@Bean
public ArticleRepository articleRepository() {
// (1) What to return ?
}
@Bean
public ArticleServiceImpl articleServiceImpl() {
ArticleServiceImpl articleServiceImpl = new ArticleServiceImpl();
articleServiceImpl.setArticleRepository(articleRepository());
return articleServiceImpl;
}
Run Code Online (Sandbox Code Playgroud)
}
在articleServiceImpl()我需要把实例articleRepository(),但它是一个接口.如何使用新关键字创建新对象?是否可以在不创建xml配置类的情况下启用自动装配?在测试期间仅使用JavaConfiguration时可以启用awtow吗?
Her*_*eri 11
这就是我发现的弹簧控制器测试的最小设置,它需要一个自动装配的JPA存储库配置(使用带有嵌入式弹簧4.1.4.RELEASE,DbUnit 2.4.8的spring-boot 1.2).
该测试针对嵌入式HSQL DB运行,该数据库在测试开始时由xml数据文件自动填充.
测试类:
@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( classes = { TestController.class,
RepoFactory4Test.class } )
@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionDbUnitTestExecutionListener.class } )
@DatabaseSetup( "classpath:FillTestData.xml" )
@DatabaseTearDown( "classpath:DbClean.xml" )
public class ControllerWithRepositoryTest
{
@Autowired
private TestController myClassUnderTest;
@Test
public void test()
{
Iterable<EUser> list = myClassUnderTest.findAll();
if ( list == null || !list.iterator().hasNext() )
{
Assert.fail( "No users found" );
}
else
{
for ( EUser eUser : list )
{
System.out.println( "Found user: " + eUser );
}
}
}
@Component
static class TestController
{
@Autowired
private UserRepository myUserRepo;
/**
* @return
*/
public Iterable<EUser> findAll()
{
return myUserRepo.findAll();
}
}
}
Run Code Online (Sandbox Code Playgroud)
笔记:
@ContextConfiguration注释,仅包含嵌入式TestController和JPA配置类RepoFactory4Test.
需要@TestExecutionListeners注释才能使后续注释@DatabaseSetup和@DatabaseTearDown生效
引用的配置类:
@Configuration
@EnableJpaRepositories( basePackageClasses = UserRepository.class )
public class RepoFactory4Test
{
@Bean
public DataSource dataSource()
{
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
return builder.setType( EmbeddedDatabaseType.HSQL ).build();
}
@Bean
public EntityManagerFactory entityManagerFactory()
{
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl( true );
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter( vendorAdapter );
factory.setPackagesToScan( EUser.class.getPackage().getName() );
factory.setDataSource( dataSource() );
factory.afterPropertiesSet();
return factory.getObject();
}
@Bean
public PlatformTransactionManager transactionManager()
{
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory( entityManagerFactory() );
return txManager;
}
}
Run Code Online (Sandbox Code Playgroud)
UserRepository是一个简单的界面:
public interface UserRepository extends CrudRepository<EUser, Long>
{
}
Run Code Online (Sandbox Code Playgroud)
EUser是一个简单的@Entity注释类:
@Entity
@Table(name = "user")
public class EUser
{
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
@Max( value=Integer.MAX_VALUE )
private Long myId;
@Column(name = "email")
@Size(max=64)
@NotNull
private String myEmail;
...
}
Run Code Online (Sandbox Code Playgroud)
FillTestData.xml:
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<user id="1"
email="alice@test.org"
...
/>
</dataset>
Run Code Online (Sandbox Code Playgroud)
DbClean.xml:
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<user />
</dataset>
Run Code Online (Sandbox Code Playgroud)
如果你正在使用Spring Boot,你可以通过添加@SpringBootTest加载来简化这些方法ApplicationContext.这允许您在spring-data存储库中自动装配.请务必添加,@RunWith(SpringRunner.class)以便拾取特定于弹簧的注释:
@RunWith(SpringRunner.class)
@SpringBootTest
public class OrphanManagementTest {
@Autowired
private UserRepository userRepository;
@Test
public void saveTest() {
User user = new User("Tom");
userRepository.save(user);
Assert.assertNotNull(userRepository.findOne("Tom"));
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在他们的文档中阅读有关弹簧启动测试的更多信息.
| 归档时间: |
|
| 查看次数: |
19450 次 |
| 最近记录: |