2017-07-05 87 views
0

我很新手到春天開機,但這裏是我現在面臨的問題:春天開機測試「無類型的排位豆可用」

// Application.java 
public class Application { 
    public static void main(String[] args) { 
    SpringApplication.run(Application.class, args); 
    } 

    @Autowired 
    private Cluster cluster = null; 

    @PostConstruct 
    private void migrateCassandra() { 
    Database database = new Database(this.cluster, "foo"); 
    MigrationTask migration = new MigrationTask(database, new MigrationRepository()); 
    migration.migrate(); 
    } 
} 

所以基本上,我試圖引導一個春天的應用程序,然後,做一些cassandra遷移。

我還定義了一個倉庫爲我的用戶模型:

// UserRepo.java 
public interface UserRepo extends CassandraRepository<User> { 
} 

現在我想用下面簡單的測試用例來測試我的回購類:

// UserRepoTest.java 
@RunWith(SpringRunner.class) 
@AutoConfigureTestDatabase(replace = Replace.NONE) 
@DataJpaTest 
public class UserRepoTest { 

    @Autowired 
    private UserRepo userRepo = null; 

    @Autowired 
    private TestEntityManager entityManager = null; 

    @Test 
    public void findOne_whenUserExists_thenReturnUser() { 
    String id = UUID.randomUUID().toString(); 
    User user = new User(); 
    user.setId(id); 
    this.entityManager.persist(user); 

    assertEquals(this.userRepo.findOne(user.getId()).getId(), id); 
    } 

    @Test 
    public void findOne_whenUserNotExists_thenReturnNull() { 
    assertNull(this.userRepo.findOne(UUID.randomUUID().toString())); 
    } 
} 

我期望測試通過,但相反,我得到一個錯誤,說「沒有合格的bean類型'com.datastax.driver.core.Cluster'可用」。它看起來像春天沒有自動裝配的對象,但爲什麼呢?我該如何解決?非常感謝!

+0

如果您看到類簇的豆在你的代碼(實現一個接口集羣),可autovired? – Jens

+1

一個可能的解決方案:刪除這兩行:'@Autowired private cluster cluster = null;' – Jens

+0

我沒有定義任何Class類的Bean,它應該由spring-boot-starter-data-cassandra提供。如果我運行我的應用程序,它就會起作用。 – fengye87

回答

4

測試環境需要知道你的bean在哪裏定義,所以你必須告訴它的位置。

在您的測試類,添加註釋@ContextConfiguration

@RunWith(SpringRunner.class) 
@AutoConfigureTestDatabase(replace = Replace.NONE) 
@DataJpaTest 
@ContextConfiguration(classes = {YourBeans.class, MoreOfYourBeans.class}) 
public class UserRepoTest { 

    @Autowired 
    private UserRepo userRepo = null; 

    @Autowired 
    private TestEntityManager entityManager = null; 
+0

我希望集羣實例會像應用程序引導時那樣自動裝配。測試環境有什麼不同? – fengye87

+0

AFAIK,執行測試時不會使用'Applcation'類,其中調用'SpringApplication.run(Application.class,args)' – JimHawkins

+0

Jim的陳述是正確的。在Spring Boot應用程序中,您有一個提供'Cluster'的配置類。你需要(也應該有)一個單獨的配置類或者XML來進行單元測試來創建你需要的任何bean。另外,'@Autowired private UserRepo userRepo = null;'是多餘的。這些默認爲空。你應該嘗試使用[構造函數注入](https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-spring-beans-and-dependency-injection.html)來使測試更容易。 –

相關問題