我想爲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());
}
}
所以,我的問題是:這是一個合法的例外,以避免現場注入還是我失去了一些東西?或者我可能會推翻這一點,因爲無論如何,現場注入在測試類中都可以使用?
從技術上講,這是可能的,但你應該更喜歡**構造函數注入**。它使你的依賴更加明確,並且讓你聲明持有依賴的字段「final」。 –
大家好,我知道。在我的問題中,我與Oliver Gierke的文章聯繫在一起,他解釋了爲什麼構造函數注入是首選。這不是我要問的。在我描述的情況下,構造函數注入是不可能的。我在我的問題中也清楚地表明瞭這一點。 – anothernode