java - 我应该如何进行或不应该进行单元测试?

标签 java spring unit-testing

我有一个由其他人编写的庞大代码库,它根本没有经过单元测试。我想向 Spring 应用程序添加单元测试。但是代码非常解耦,有时代码不可测试。我应该如何处理这个问题,我应该从低级对象开始还是从高级对象开始一次,您能给我一个如何为 Spring 应用程序编写单元测试的分步示例吗?

最佳答案

您可以轻松地将@Autowired 属性转换为@Autowired 构造函数。检查这个例子:

@Component
public class SomeClass {
    @Autowired
    private SomeDependency someDependency;

    public ... doSomething(...) {
        ...
    }
}

可以转化为

@Component
public class SomeClass {

    private SomeDependency someDependency;

    @Autowired
    public SomeClass(SomeDependency someDependency) {
        this.someDependency = someDependency;
    }

    public ... doSomething(...) {
        ...
    }
}

事实上,这种注入(inject)方法是首选,因为您的对象在构造函数完成时拥有它所需的所有依赖项。在第一种方法中,您需要执行以下操作:

SomeClass someClass = new SomeClass();
someClass.setSomeDependency(someDependency); // <- you would need to add this

这也可能发生!

SomeClass someClass = new SomeClass();
someClass.methodThatUsesSomeDependency(); // <- NullPointerException since someDependency is not initialized!

所以,通过使用构造函数注入(inject),你是安全的!您还可以通过将依赖项设置为最终依赖项来添加一些额外的安全性,以便它们必须在构造函数结束时初始化:

@Component
public class SomeClass {

    private final SomeDependency someDependency;

    @Autowired
    public SomeClass(SomeDependency someDependency) {
        // Removing this line will cause a compile time error
        this.someDependency = someDependency;
    }

    public ... doSomething(...) {
        ...
    }
}

所以,总结一下:将您的 @Autowired 注释移至构造函数,一切都会顺利。

一旦你有了一个以其依赖项作为参数的构造函数,单元测试就应该很简单了

关于java - 我应该如何进行或不应该进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46209879/

相关文章:

java - 如何从 Spring 中的 bean 中获取 bean 的 id?

java - Camel : ClassCastException: DefaultMessage cannot be cast to class SnmpMessage

java - 仅验证少数元素的单元测试

java - 为什么spring boot vaadin app无法运行?

Java - 泛型问题

java - JUnit |模拟服务器|休息模板

unit-testing - 我应该对并发性进行单元测试吗?

java - 模拟类的所有实例

java - 从 ActionPerformed 调用方法并在主线程上运行它

java - 强制执行打印顺序,但线程在一次迭代后彼此等待