gpt4 book ai didi

java - Mockito JUnit 测试 : check method call in constructor

转载 作者:行者123 更新时间:2023-11-30 02:54:31 25 4
gpt4 key购买 nike

我有一个带有私有(private)和公共(public)或 protected 方法的类 Foo。例如:

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 测试这个类。

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...框架。它们依赖于字节码操作;这迟早会带来麻烦。相信我,我花了很多时间寻找非常奇怪的错误,但没有任何充分的理由。

那么:不要以这种方式测试你的代码!

您使用模拟框架来创建/控制那些传递到“被测类”的对象。您不使用框架直接测试您的“被测类”!

您也不想编写了解私有(private)方法的测试代码 - 这些是实现细节。

你会做什么:

a) 如前所述,您可以使用模拟将对象传递到被测试的类中。然后您可以控制/验证这些模拟是否看到您期望“被测试的类”进行的调用

b)您创建“被测试类”的对象......然后“断言”这些对象的属性;或方法调用返回的结果。

准确地说:模拟对象......不知道“原始”类中的代码任何。这是一个模拟!您不能将它用于您的问题暗示您想要做的那种测试。要么调用真实类的方法;或者你为模拟指定一些东西。但是创建一个模拟然后将其“关联”到具体的类实现......是根本不可能的。

最后:如果您认为您的具体类实际上“太大”而无法以正常的测试方式创建......那么很可能:您的类对于其他任何东西来说都太大 。类(class)规模宜小;他们的设计应该遵循SOLID原则。

长话短说:不要试图通过使用 PowerMock 来强制不可测试的代码进入“测试”......您最好投入更多时间来提高生产代码的质量;这将带来更高的“投资返回率”。

关于java - Mockito JUnit 测试 : check method call in constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37659024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com