最好在Spring测试类中使用@Autowired或new?

时间:2016-11-18 10:00:46

标签: java spring junit

我在为春季应用程序编写单元测试时遇到了一些麻烦,我想知道这个问题。

我们来看下面的例子:

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

    @Autowired
    private AlbumDTOConverter albumDTOConverter;

    @Test
    public void ToEntity_ReturnValue_NotNull() {
        AlbumDTO albumDTO = new AlbumDTO("Summer album", new Date(), "This summer, we have made some wonderfull photos. Have a look!", null);
        assertNotNull(albumDTOConverter.toEntity(albumDTO));
    }
}

为了使@Autowired正常工作,我启动了一个容器,其中使用@SpringBootTest注释了测试类。

事情是,我认为我做错了。在我看来,我只想使用instance运算符而不是使用Spring的IoD来创建新的AlbumDTOConverter new

你们对此有何看法?

2 个答案:

答案 0 :(得分:4)

对于单元测试,您不需要启动整个容器。根据定义,这些单元应该单独测试。使用 new 关键字创建类的实例非常好。即使该类依赖于其他类,您也可以手动创建它们并传递给该类的适当构造函数。

请注意单位与班级不同。单位的术语通常在开发人员之间混淆,尤其是初学者。您不必在单元测试中依赖依赖注入。 容器只会增加执行测试所需的时间,而执行时间长是开发人员经常避免运行它们的主要原因。为测试中的单元手动构建依赖关系树没有任何问题。

从长远来看,为不同的测试创建类似的输入可能会导致测试代码重复,但幸运的是,这个问题有最佳实践,例如: shared fixture

答案 1 :(得分:1)

如果您正在进行单元测试,那么每次都不应该使用@Autowire。

单元测试基础说“单元测试负责测试一段特定的代码,只是代码的一个小功能(单元)”

现在的问题是何时使用弹簧功能?

有时,您需要依赖Spring框架进行一些单元测试,例如Web服务调用,存储库调用等。例如,如果您的存储库具有使用@Query注释的自定义查询,则可能需要测试你的查询。此外,如果要序列化/反序列化对象,则需要确保对象映射正常工作。当您进行参数验证或错误处理时,您可能还想测试控制器。你怎么能确定你正确使用Spring?在这些情况下,您可以利用新的Spring Boot测试注释。

我认为这会给出更好的主意。