我有一个巨大的代码库,由其他人编写,根本没有经过单元测试。我想将单元测试添加到spring应用程序。但是代码很多都是解耦的,有时候代码是不可测试的。如果我从低级对象或高级对象开始,我该如何处理这个问题,你能给我一个如何为spring应用程序编写单元测试的一步一步示例。
答案 0 :(得分:3)
您可以轻松地将var regionInfo = RegionInfo.CurrentRegion;
var name = regionInfo.Name;
var englishName = regionInfo.EnglishName;
var displayName = regionInfo.DisplayName;
Console.WriteLine("Name: {0}", name);
Console.WriteLine("EnglishName: {0}", englishName);
Console.WriteLine("DisplayName: {0}", displayName);
属性转换为@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(...) {
...
}
}
这也可能发生!
SomeClass someClass = new SomeClass();
someClass.setSomeDependency(someDependency); // <- you would need to add this
因此,通过使用构造函数注入,您是安全的!您还可以通过将依赖项设置为final来添加一些额外的安全性,以便在构造函数结束时必须初始化:
SomeClass someClass = new SomeClass();
someClass.methodThatUsesSomeDependency(); // <- NullPointerException since someDependency is not initialized!
所以,总结一下:将你的@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(...) {
...
}
}
注释移动到构造函数,一切都会顺利。
一旦你有一个构造函数,其依赖关系作为参数单元测试,它应该是微不足道的
答案 1 :(得分:0)
您可以参考Integration Testing provided by Spring
下面是一个示例JUnit测试类,它在Spring Context中为bean提供测试用例。
@ContextConfiguration(locations = { "/your-spring-cfg.xml" })
public class YourTest extends AbstractJUnit4SpringContextTests
{
@Autowired
private YourBean beanToTest;
@Test
public void testYourBean()
{
beanToTest.method();
....
}
}
修改强>
对于配置类,您可以参考以下代码。
@ContextConfiguration(classes=YourConfigClass.class, loader=AnnotationConfigContextLoader.class)
public class YourTest extends AbstractJUnit4SpringContextTests
{
@Autowired
private YourBean beanToTest;
@Test
public void testYourBean()
{
beanToTest.method();
....
}
}