2016-10-03 68 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

很高興幫助。 –