我该如何接近或不应该进行单元测试?

时间:2017-09-14 03:08:04

标签: java spring unit-testing

我有一个巨大的代码库,由其他人编写,根本没有经过单元测试。我想将单元测试添加到spring应用程序。但是代码很多都是解耦的,有时候代码是不可测试的。如果我从低级对象或高级对象开始,我该如何处理这个问题,你能给我一个如何为spring应用程序编写单元测试的一步一步示例。

2 个答案:

答案 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();
        ....
    }
}