2016-10-03 103 views
0

在我的一个JUnit测试类中注入依赖项有些麻烦。 我相信TestApplication不是包扫描或未被加载。下面在Junit测试中无法注入依赖项

代码:

package com.mitto.repositories; 

import static org.junit.Assert.*; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.TestExecutionListeners; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; 
import org.springframework.test.context.transaction.TransactionalTestExecutionListener; 

import com.github.springtestdbunit.DbUnitTestExecutionListener; 
import com.github.springtestdbunit.annotation.DatabaseSetup; 
import com.mitto.MittoApplicationTests; 
import com.mitto.domain.User; 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes= { MittoApplicationTests.class }) 
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, 
    TransactionalTestExecutionListener.class, 
    DbUnitTestExecutionListener.class}) 
@DatabaseSetup("UserRepositoryTest.xml") 
public class UserRepositoryTest { 

    @Autowired 
    UserRepository repository; 

    private static final long FACEBOOK_ID = 1234567; 

    @Test 
    public void getUserById() { 
     User user = repository.findOne(1L); 
     assertNotNull(user); 
     assertEquals(user.getFacebookId(), FACEBOOK_ID ); 
    } 
} 

MittoApplicationTests.java

package com.mitto; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.boot.test.context.SpringBootTest; 
import org.springframework.test.context.junit4.SpringRunner; 

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class MittoApplicationTests { 

    @Test 
    public void contextLoads() { 
    }  
} 

UserRepository.java

package com.mitto.repositories; 

import org.springframework.data.repository.PagingAndSortingRepository; 
import org.springframework.stereotype.Repository; 

import com.mitto.domain.User; 

@Repository 
public interface UserRepository extends PagingAndSortingRepository<User, Long>{ 

    User findByFacebookId(long facebookId); 
    User findByAuthToken(String token); 

} 

我看不出什么错。

回答

2

有时,一个工作示例比修复更好。
这里是一个工作示例:

首先,在您的配置类

@SpringBootApplication 
@ComponentScan(value = "com.mitto") 
@EnableJpaRepositories(value = "com.mitto") 
@EntityScan(basePackages = {"com.mitto.domain"}, basePackageClasses = {Jsr310JpaConverters.class}) 
public class MittoApplicationTests { 
} 

其次,在您的测试类

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringBootTest(classes = MittoApplicationTests.class) // replace the @ContextConfiguration with @SpringBootTest 
// rest of of your annotations ... 
public class UserRepositoryTest { 
    @Autowired 
    UserRepository repository; 

    // your test cases 
} 

一个春天启动的应用程序仅仅是一个Spring的ApplicationContext,所以没有什么特别的事情要做,以超越你通常用vanilla Spring环境做的测试。但要注意的一点是,Spring Boot的外部属性,日志记录和其他功能仅在默认情况下安装在上下文中,如果使用SpringApplication创建它。

Spring Boot提供@SpringBootTest注释,当您需要Spring Boot功能时,它可以用作标准spring-test @ContextConfiguration注释的替代方法。注解的工作原理是通过SpringApplication在您的测试中创建ApplicationContext。

请阅读文档了解更多信息:

SpringBootTest annotation

boot-features-testing

+0

感谢岳敏君,帮我解决我的问题,并提供了一个更好地了解我。干杯! – scottazord

+0

@scottazord具有类的值的'@ SpringBootTest'指定用于加载ApplicationContext的类。除此之外,它并没有做太多的事情。 –

+0

很高兴帮助。 –