我想为 Spring Data 存储库编写集成测试,并想知道使存储库在测试类中可用的首选方法是什么。
当测试我自己的普通旧服务时,我使用类似的东西来避免必须使用字段注入(inject),因为不应该使用字段注入(inject) according to Spring Data project lead Oliver Gierke :
public class myServiceTest {
private MyService myService;
@Before
public void setUp() {
myService = new MyService();
}
[...]
}
但是 Spring Data 存储库被定义为没有实现的接口(interface),因为 Spring 魔法动态创建实现。
public interface FruitRepository extends CrudRepository<Fruit, Long> {
List<Fruit> findByName(String name);
}
因此,没有我可以像这样使用的构造函数。
使用构造函数注入(inject)(如下面的示例所示)也不起作用,因为它在尝试运行测试时会产生异常:
@Autowired
public MyServiceTest(MyService myService) {
this.myService = myService;
}
java.lang.Exception: Test class should have exactly one public zero-argument constructor
据我所知,我剩下的唯一选择是通过字段注入(inject)来注入(inject)存储库,如以下工作示例所示:
@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());
}
}
所以,我的问题是:这是避免字段注入(inject)规则的合法异常(exception)还是我遗漏了一些东西?或者我可能想得太多了,因为无论如何在测试类中使用字段注入(inject)都是可以的?
最佳答案
对于测试来说,这完全没问题。
对于当前版本的 JUnit,确实没有合理的方法来以不同的方式进行操作。
首选构造函数注入(inject)的一点是其他代码片段可以正确实例化类,而无需使用任何反射魔法。但是除了 JUnit 之外没有人会尝试实例化您的测试,因此该参数无效。
Spring Data本身的集成测试就使用这种方法。例如,参见此处 https://github.com/spring-projects/spring-data-jpa/blob/master/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java#L97请注意,奥利弗是作者之一,所以我猜他也同意。
关于java - Spring 数据存储库的测试类中的字段注入(inject)合法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46094725/