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

如何单元测试其构造函数接受一些参数的类的方法?

叶鸿
2023-03-14

我有一个类似这样的表单类:

class A{  
    public function __constructor(classB b , classC c){
    //
    }

    public function getSum(var1, var2){
        return var1+var2;
    }
}

我的测试用例类是这样的:

use A;   
class ATest extends PHPUnit_Framework_TestCase{  

    public function testGetSum{  
        $a = new A();
        $this->assertEquals(3, $a->getSum(1,2));  
    }  
}  

但是,当我运行phpunit时,它会抛出一些错误,如:

缺少\..\::\ \u construct()的参数1,在/./A.php的第5行调用

即使我提供参数,它也会在不同的文件中抛出相同的错误

然后,我得到了类B的构造函数相同的错误(类B的构造函数具有与A相似的形式)。

第10行的/./B.php中调用的\..\::\ \uu construct()缺少参数1

有没有其他方法,我可以测试功能或我缺少的东西。

我不想使用mock(getMockBuilder(),setMethods(),getMock())进行测试,因为它似乎违背了单元测试的全部目的。

共有2个答案

帅雅逸
2023-03-14

您可以告诉PHPUnit您想要模拟指定类的哪个方法,方法为set方法。来自医生:

可以在Mock Builder对象上调用set方法(数组$方法)来指定将被可配置的测试双重替换的方法。其他方法的行为不会改变。如果调用setmethod(null),则不会替换任何方法。

因此,您可以在不替换任何方法的情况下构造您的类,但可以绕过如下构造(工作)代码:

public function testGetSum(){
    $a = $this->getMockBuilder(A::class)
        ->setMethods(null)
        ->disableOriginalConstructor()
        ->getMock();

    $this->assertEquals(3, $a->getSum(1,2));
}

希望这有帮助

桓修能
2023-03-14

单元测试背后的基本思想是测试类/方法本身,而不是该类的依赖关系。为了对classA进行单元测试,您不应该使用构造函数参数的真实实例,而应该使用mockPHPUnit提供了一种很好的创建方法,因此:

use A;   
class ATest extends PHPUnit_Framework_TestCase{  

    public function testGetSum{  
        $arg1Mock = $this->getMock('classB'); //use fully qualified class name
        $arg2Mock = $this->getMockBuilder('classC')
            ->disableOriginalConstructor()
            ->getMock(); //use mock builder in case classC constructor requires additional arguments
        $a = new A($arg1Mock, $arg2Mock);
        $this->assertEquals(3, $a->getSum(1,2));  
    }  
}  

注意:如果你在这里不使用mock,而是使用一个真正的类B和类C实例,它将不再是单元测试——它将是一个功能测试

 类似资料:
  • 问题内容: 我有一堂课要添加单元测试。该类具有多个构造函数,这些构造函数采用不同的类型并将其转换为规范形式,然后可以将其转换为其他类型。 实际上,它接受并转换为其他两种类型。 我正在尝试找出最合适的方法来测试这些构造函数。 应该有一个针对每个构造函数的测试和输出类型: 这导致许多不同的测试。如您所见,我正在努力命名它们。 应该有多个断言: 这有多个断言,这使我感到不舒服。它还正在测试getStri

  • Kotlin中的参数与Java中有些不同。如你所见,我们先写参数的名字再写它的类型: fun add(x: Int, y: Int) : Int { return x + y } 我们可以给参数指定一个默认值使得它们变得可选,这是非常有帮助的。这里有一个例子,在Activity中创建了一个函数用来toast一段信息: fun toast(message: String, length: I

  • 问题内容: 这些来自github上的spring amqp示例,位于https://github.com/SpringSource/spring-amqp- samples.git 这些是 什么类型的Java构造函数?它们是吸气剂和吸气剂的捷径吗? 与此相反 问题答案: 这些构造函数被重载以使用调用另一个构造函数。第一个无参数构造函数使用空参数调用第二个。第二呼叫的第三构造(未示出),其必须采取,

  • 如果我有一个带有@PostConstruct方法的类,如何使用 JUnit 和 Spring 测试它的构造函数和它的@PostConstruct方法?我不能简单地使用新的 ClassName(param,param),因为这样它就不会使用 Spring -- @PostConstruct 方法不会被触发。 我错过了什么明显的东西吗? 我有一些类似的东西(虽然稍微复杂一点),但是@PostConst