单元测试的正确方法是什么?理想情况下,我只想验证某个程序的(模拟)实例调用了主方法中的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());
}
}
测试程序的功能,而不是程序本身。
可以通过使用依赖项注入来实现这一点。如果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();
}
没有有用的方法对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注入。有人能解释如何使用依赖项而不是构造函数参数来做到这一点吗?