我有以下课程:
public class LegacyClass()
{
public LegacyClass(final int aModeOfOperation)
{
if (aModeOfOperation == 0)
{
addSomeValues();
addSomeValues();
}
else if (aModeOfOperation == 1)
{
addSomeValues();
}
}
private void addSomeValues()
{
}
}
我想写一个单元测试,它会检查
LegacyClass(0)
会导致调用私有方法add某值
2次,并且LegacyClass(1)
会导致调用一次私有方法add某值
。我知道在Mockito/PowerMockito中使用间谍对象来计算私有方法调用的数量是可能的,但是AFAIK这些方法只有在测试类构建后调用所讨论的方法时才有效。
有没有可能在不改变LegacyClass
的构造函数的情况下编写上面描述的单元测试?
我认为使用mockito是不可能的,因为您以这种方式声明spyspy(new LegacyClass())
,因此在监视对象之前会调用构造函数。也许有一种方法可以使用PoweverMock,但我通常不鼓励使用PowerMock,因为没有将代码重构为正确的设计。
相反,我强烈建议您将遗留代码重构为更可测试的代码(测试驱动开发是这里的关键)。
如果您绝对需要保留这个遗留代码与兼容的更改,但没有PowerMock;我将首先提高可见性级别,使包可见:
private void addSomeValues() { ... }
然后在测试中编写一个LegacyClass
的静态子类,并重写将增加一个计数器调用超级的add某值
方法。
public class LegacyCodeTest {
...
static class AddSomeValuesCounteringLegacyClass extends LegacyClass {
public int counter;
void addSomeValues() { counter = counter + 1; super.addSomeValues(); }
}
}
然后在您的测试中,您不满足这个类并断言调用计数;
我认为,如果您能够执行基于状态的测试,那么您可以从单元测试中获得更好的价值(http://blog.jayfields.com/2008/02/state-based-testing.html?m=1)关于公共方法的需求/行为,而不是测试私有方法的调用次数。这在一些隔离框架中可能是可能的,但从单元测试的角度来看,我看不出有多大价值。
想想某个单元测试,你会验证一个方法已经被调用,或者一个方法已经被调用了x个数字。这些测试是验证测试,它们仍然有效。但是关键因素是大多数模拟对象框架允许您对公共方法(至少在. net中)进行这些验证。原因是从单元测试的角度来看,私有方法并不重要,因为它们是内部实现细节。尽量避免代码原理图更改的测试失败。
问题内容: 如何使用Hibernate验证程序来验证构造函数或方法中的参数?我希望在ValueObject创建之前进行验证,因此除非所有参数都有效,否则我可以引发异常而不创建对象。 基本上,我正在尝试使用注释,而不是尽可能执行以下操作: 我试过遵循这样的文档,虽然看起来似乎有效,但仍然会导致创建对象。 将注释添加到构造函数参数似乎无效 我如何创建对象: 验证器: 问题答案: 对于找到此帖子的其他任
我想覆盖类LocalDate的toString()方法。我知道如何使用像java.util.Date这样的公共构造函数覆盖类的toString()方法: 但我不能对像java这样有私有构造函数的类做同样的事情。时间LocalDate有什么办法可以解决这个问题吗?
问题内容: 对不起任何较小的语法错误或其他错误,我正在使用Jitsi模块进行此操作,并且对Java不太熟悉,因此想确认正在发生的事情以及为什么以及如何对其进行修复。 使用按名称加载类方法创建类B的实例时,应用程序正在执行此操作: 在类B中调用重写的load() 初始化变量(根据调试器调用“私有字符串testString = null”),将其无效。 这是预期的Java行为吗?是什么原因造成的?它是
我有一个接口,它在两个地方定义如下: 我的客户端实现类没有任何注释,只有必需的构造函数。在这种情况下,如何限定正确的接口实现用法?我不想使用,因为在我的例子中,将其中一个用法命名为primary在语义上是不正确的(它们在某种意义上是相等的)。我需要用相同的实现类传递相同的接口,但针对受尊敬的客户机的特定用例进行了不同的配置。我想命名一个参数就足够了,通过这个参数我将实现注入到bean创建方法中,但
本文向大家介绍解析C#中的私有构造函数和静态构造函数,包括了解析C#中的私有构造函数和静态构造函数的使用技巧和注意事项,需要的朋友参考一下 私有构造函数 私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。例如: 声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问