Mockito JUnit 测试:检查构造函数中的方法调用
Mockito JUnit testing: check method call in constructor
我有一个 class Foo 具有私有和 public 或受保护的方法。例如:
public class Foo{
private int number;
public Foo(){
setup();
doSthing();
}
private void doSthing(){
number=10;
}
public void setup(){
}
protected int getNumber(){
return number;
}
public void run(){
getNumber();
//Do blah blah...
}
}
我正在尝试使用 Mockito 测试这个 class。
public class FooTest
{
public void testMethods()
{
Foo foo = PowerMockito.mock (Foo.class);
//1 What should I do to see that setup() and doSthing()
//has been called on Foo construction
mock.run();
//2 What should I do to see that getNumber()
//has been called on run() method call
}
}
如果可能的话,我也希望包括 "times(1)"。非常感谢你的帮助。
你弄错了:
首先:请不要使用任何 PowerMock... 框架。他们依赖于字节码操作;这迟早会带来麻烦。相信我,我花了很多时间寻找非常奇怪的错误,但没有充分的理由。
然后:不要这样测试你的代码!
您使用模拟框架 create/control 您 传递 给 "class under test" 的那些对象。你不使用框架直接测试你的"class under test"!
您也不想编写了解 私有 方法的测试代码 - 这些是实现细节。
你做了什么:
a) 如前所述,您可以使用模拟将对象传递到您的 class 被测对象中。然后你可以 control/verify 那些模拟看到你希望 "class under test" 进行的调用
b) 您创建 "class under test" 的对象...然后 "assert" 这些对象的属性;或方法调用 return.
的结果
准确地说:一个模拟对象...对 "original" class 中的代码一无所知。这是一个mock!您不能将它用于您的问题暗示您想做的那种测试。要么你在你的真实 class 上调用方法;或者您为模拟指定一些东西。但是创建一个模拟然后 "associate" 它到具体的 class 实现......根本不可能。
最后:如果您认为您的具体 class 实际上是 "too big" 只是以正常的测试方式创建...那么很可能:您的 class 只是 太大了 其他任何东西。 类应该小;他们的设计应该遵循 SOLID 原则。
长话短说:不要试图通过使用 PowerMock 将不可测试的代码强加到 "tests" 中......您最好投入更多时间来提高生产代码的质量;这将导致更高的 "return on investment"。
我有一个 class Foo 具有私有和 public 或受保护的方法。例如:
public class Foo{
private int number;
public Foo(){
setup();
doSthing();
}
private void doSthing(){
number=10;
}
public void setup(){
}
protected int getNumber(){
return number;
}
public void run(){
getNumber();
//Do blah blah...
}
}
我正在尝试使用 Mockito 测试这个 class。
public class FooTest
{
public void testMethods()
{
Foo foo = PowerMockito.mock (Foo.class);
//1 What should I do to see that setup() and doSthing()
//has been called on Foo construction
mock.run();
//2 What should I do to see that getNumber()
//has been called on run() method call
}
}
如果可能的话,我也希望包括 "times(1)"。非常感谢你的帮助。
你弄错了:
首先:请不要使用任何 PowerMock... 框架。他们依赖于字节码操作;这迟早会带来麻烦。相信我,我花了很多时间寻找非常奇怪的错误,但没有充分的理由。
然后:不要这样测试你的代码!
您使用模拟框架 create/control 您 传递 给 "class under test" 的那些对象。你不使用框架直接测试你的"class under test"!
您也不想编写了解 私有 方法的测试代码 - 这些是实现细节。
你做了什么:
a) 如前所述,您可以使用模拟将对象传递到您的 class 被测对象中。然后你可以 control/verify 那些模拟看到你希望 "class under test" 进行的调用
b) 您创建 "class under test" 的对象...然后 "assert" 这些对象的属性;或方法调用 return.
的结果准确地说:一个模拟对象...对 "original" class 中的代码一无所知。这是一个mock!您不能将它用于您的问题暗示您想做的那种测试。要么你在你的真实 class 上调用方法;或者您为模拟指定一些东西。但是创建一个模拟然后 "associate" 它到具体的 class 实现......根本不可能。
最后:如果您认为您的具体 class 实际上是 "too big" 只是以正常的测试方式创建...那么很可能:您的 class 只是 太大了 其他任何东西。 类应该小;他们的设计应该遵循 SOLID 原则。
长话短说:不要试图通过使用 PowerMock 将不可测试的代码强加到 "tests" 中......您最好投入更多时间来提高生产代码的质量;这将导致更高的 "return on investment"。