当前位置: 首页 > 知识库问答 >
问题:

Java-如何单元测试主方法依赖关系?

洪弘毅
2023-03-14

单元测试的正确方法是什么?理想情况下,我只想验证某个程序的(模拟)实例调用了主方法中的run()方法。我知道我可以创建一个setter来设置某个程序的实例,但是它看起来像一种代码味道,因为它除了启用更容易的测试之外没有做任何事情?与run()方法上的公共访问器相同。为了测试的目的,它是自由的。如果它是私人的,我如何测试它?我正在寻找类的变化,也许应用一些设计模式来缓解这个问题。

public class SomeProgram {

    public void run(Dependency1 dependency1, Dependency2 dependency2) {
        dependency1.doSomething();
        dependency2.doSomething();
    }

    public static void main(String[] args) {
        new SomeProgram().run(new Dependency1(), new Dependency2());
    }
}

共有2个答案

法兴德
2023-03-14

测试程序的功能,而不是程序本身。

可以通过使用依赖项注入来实现这一点。如果Dependency1是一个接口而不是一个具体的类,那么这种方法效果最好。

public class SomeProgram 
{
    private final Dependency1 _dependency1;
    private final Dependency2 _dependency2;

    public SomeProgram(Dependency1 dependency1, Dependency2 dependency2)
    {
        _dependency1 = dependency1;
        _dependency2 = dependency2;
    }

    public void run() 
    {
        dependency1.doSomething();
        dependency2.doSomething();
    }
}

那么,您的主要方法将与单元测试完全相同,只是它将注入真正的依赖关系。

public static void main(String[] args) 
{
    new SomeProgram(new Dependency1(), new Dependency2()).run();
}
廖永长
2023-03-14

没有有用的方法对main方法进行单元测试。通常,这些方法初始化一个对象图(或者显式地调用Spring或Guice这样的DI容器),因此最终没有任何真正有用的测试接缝可以直接注入模拟或赝品。

你能做的就是使用集成测试。您可以设置您的集成环境,并配置主方法来指向您的测试控制下的东西。因此,例如,如果您的程序与数据库对话,那么您的测试可以旋转嵌入式数据库,并使用命令行参数将程序指向嵌入式数据库,而不是外部数据库。类似地,您可以使用嵌入式Jetty伪造外部Rest API。

但是重要的是要接受这些不是单元测试。它们是集成测试,会有你通常与集成测试联系在一起的问题——它们比单元测试慢,你对系统的控制也少,所以测试一些事情可能很棘手。

 类似资料:
  • 我有以下方法,它采用UNIX时间戳并以天、小时或分钟的形式返回年龄。我想用JUnit单元测试它,但我不确定如何开始这样做,因为当前时间不断变化。有什么建议吗?谢谢! 方法如下: }

  • 问题内容: 我有一段代码,我不知道如何进行单元测试!该模块使用urllib2从外部XML提要(twitter,flickr,youtube等)中提取内容。这是一些伪代码: 我的第一个想法是腌制响应并加载它以进行测试,但是显然urllib的响应对象是不可序列化的(它引发了异常)。 仅从响应主体保存XML是不理想的,因为我的代码也使用标头信息。它旨在作用于响应对象。 当然,在单元测试中依赖外部数据源是

  • 我们正在将基于spring的camel应用程序迁移到基于蓝图的camel应用程序。我们还将迁移到fuse 6.1版本。我正在使用带有Junit runner的Pax考试和apache felix容器来执行我的单元测试。我面临与ehcache manager相关的未解决捆绑包问题。我曾尝试将pax配置作为mavenBundle提供所需的依赖性,但没有任何运气。异常并没有给出缺少依赖项的细节,而是只给

  • 我扩展了基本的Spring Boot示例,向我的控制器添加了一个“自动连接”的存储库依赖项。我想修改单元测试,为该依赖注入一个Mockito mock,但我不知道如何做。 我期待我能做这样的事情: 但它不会将mock注入。有人能解释如何使用依赖项而不是构造函数参数来做到这一点吗?