我有一个由其他人编写的庞大代码库,它根本没有经过单元测试。我想向 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/