2017-09-07 21 views
0

我想爲Spring Data repository編寫一個集成測試,並想知道在測試類中使存儲庫可用的首選方式是什麼。Spring數據存儲庫測試類中的字段注入是否合法?

當測試我自己的普通的舊服務,我用這樣的事情,以避免使用字段注入,因爲字段注入不應該被用來according to Spring Data project lead Oliver Gierke

public class myServiceTest { 

    private MyService myService; 

    @Before 
    public void setUp() { 
     myService = new MyService(); 
    } 

    [...] 
} 

但春天的數據存儲庫,而不定義爲接口一個實現,因爲Spring魔術動態地創建了實現。

public interface FruitRepository extends CrudRepository<Fruit, Long> { 

    List<Fruit> findByName(String name); 
} 

因此,沒有任何構造函數可以使用。

使用構造函數注入,如follwoing例子,也不起作用,因爲它產生試圖測試運行時異常:

@Autowired 
public MyServiceTest(MyService myService) { 
    this.myService = myService; 
} 

java.lang.Exception: Test class should have exactly one public zero-argument constructor 

據我所看到的,我唯一的選擇m左側通過字段注入如下面的工作實例注入資源庫:

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

    @Autowired 
    private FruitRepository fruitRepository; 

    @Test 
    public void findByNameFindsAnExistingFruit() { 

     fruitRepository.deleteAll(); 
     fruitRepository.save(new Fruit("Orange")); 
     List<Fruit> foundFruits = fruitRepository.findByName("Orange"); 

     assertFalse(foundFruits.isEmpty()); 
    } 

    @Test 
    public void findByNameDoesNotFindANonExistingFruit() { 

     fruitRepository.deleteAll(); 
     fruitRepository.save(new Fruit("Apple")); 
     List<Fruit> foundFruits = fruitRepository.findByName("Orange"); 

     assertTrue(foundFruits.isEmpty()); 
    } 
} 

所以,我的問題是:這是一個合法的例外,以避免現場注入還是我失去了一些東西?或者我可能會推翻這一點,因爲無論如何,現場注入在測試類中都可以使用?

+0

從技術上講,這是可能的,但你應該更喜歡**構造函數注入**。它使你的依賴更加明確,並且讓你聲明持有依賴的字段「final」。 –

+0

大家好,我知道。在我的問題中,我與Oliver Gierke的文章聯繫在一起,他解釋了爲什麼構造函數注入是首選。這不是我要問的。在我描述的情況下,構造函數注入是不可能的。我在我的問題中也清楚地表明瞭這一點。 – anothernode

回答

1

對於測試,這是非常好的。

  1. 對於當前版本的JUnit,確實沒有什麼合理的方法可以做到這一點。

  2. 更喜歡構造函數注入的一點是,其他代碼片段可以正確實例化類,而無需使用任何反射魔術。但除了JUnit之外,沒有人會嘗試實例化你的測試,所以這個論證是無效的。

  3. Spring Data自身的集成測試使用了這種方法。請看這裏的例子https://github.com/spring-projects/spring-data-jpa/blob/master/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java#L97請注意,奧利弗是其中的作者,所以我猜他也贊同。