java - Spring 数据存储库的测试类中的字段注入(inject)合法吗?

标签 java spring dependency-injection spring-data

我想为 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)都是可以的?

最佳答案

对于测试来说,这完全没问题。

  1. 对于当前版本的 JUnit,确实没有合理的方法来以不同的方式进行操作。

  2. 首选构造函数注入(inject)的一点是其他代码片段可以正确实例化类,而无需使用任何反射魔法。但是除了 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请注意,奥利弗是作者之一,所以我猜他也同意。

关于java - Spring 数据存储库的测试类中的字段注入(inject)合法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46094725/

相关文章:

java - SSLHandshakeException : ValidatorException: PKIX path building failed: sun. security.provider.certpath.SunCertPathBuilderException:

java - 为什么这段代码在包装在通用函数中时不起作用?

c# - 在 WebApi 项目上使用 Unity 依赖注入(inject)时 DbContext 被释放

flutter - 如何在 flutter 中使用可注入(inject)和 get_it 的共享偏好?

java - 对于远程过程调用,是否有比 Apacher River (Jini) 更好的技术?

java - 在 Spring Session JDBC 中使用 JSON 格式

java - Spring MVC - 跨 Controller 的继承变量值

language-agnostic - 当方法需要创建新对象时有关依赖注入(inject)的新手问题

带有 j2me 客户端套接字的 Java tcp 套接字服务器

java - 滚动透明 GUI 模糊文本,JAVA