Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito:模拟成员变量_Java_Unit Testing_Mockito - Fatal编程技术网

Java Mockito:模拟成员变量

Java Mockito:模拟成员变量,java,unit-testing,mockito,Java,Unit Testing,Mockito,我有以下代码: public class ABC { private double a; Other_object other_object; public ABC(int a, int[] b){ this.a=a; other_object=new Other_object(b); } ... public int method_1(){ return other_object.other_method(); } public int method_2(){

我有以下代码:

public class ABC {

private double a;
Other_object other_object;

public ABC(int a, int[] b){
    this.a=a;
    other_object=new Other_object(b);
}
...
public int method_1(){
    return other_object.other_method();
}

public int method_2(){
    if(method_1()>0 && a>0)
        return 1;
    else 
        return 0;
}
}

我创建了以下模拟对象:

ABC a=模拟(ABC.class);
Mockito.when(a.method1())。然后返回(0)

我无法设置“int a”的值。 我试图在ABC中创建一个setter函数,并对其进行模拟,但它不起作用。 我想知道为什么模拟setter函数不起作用我如何模拟这个值(inta)?

模拟是一个“假装”做某事的对象。因此,关于mock,重要的是它的行为,而不是它的状态(因为它实际上没有太多的状态)。当然,您可以让mock对setter作出反应,存储值,然后通过getter返回它,例如通过一个应答(我不提供这方面的代码),但我几乎可以保证,对于您遇到的任何问题,这都不是一个好的解决方案

模拟是指当你实际上不需要一个真实的对象,但想测试另一个依赖它的对象时。所以你的模拟对象只是测试其他东西的一种方式

例如,假设您正在测试类
MyClass
。是不是有这样的方法

public int doSomething(ABC abc) {
    return abc.method_1 * 2;
}
如果出于任何原因不想使用真正的“ABC”对象,可以对其进行模拟。您对MyClass的测试将如下(浓缩)

如果您实际上需要在mock中存储一些值,那么您或者不需要mock,或者您的测试用例非常复杂。记住:测试应该测试一件事。它应该只有一个故障点。如果您有多个测试用例,请使用多个方法,而不是一个。如果您的对象需要执行的不仅仅是基本的“调用方法,给结果”模拟可能不是正确的工具

但是在你的例子中,你的a对于ABC的任何实例都是常数。您可以在构造函数中初始化它。因此,对于您创建的任何模拟,您的a也是常量。所以,如果你需要模拟方法2,那么你也已经知道结果了。。。不需要在任何地方设置一个。如果您想模拟ABC,您已经知道了一个,因此知道在一个真正的ABC上方法将返回什么。不需要mock实际存储并使用它

编辑:如果要测试方法_2(),则要测试的是类ABC本身。因此,创建一个模拟ABC类是完全没有意义的,因为你要测试的只是这个“假”ABC,而不是真实的ABC,所以你最终会像以前一样聪明,对ABC一无所知。因此,如果您想测试ABC.method_2(),那么就创建一个实际的ABC实例

ABC abcToTest = new ABC(...);
Assert.assertEquals(..., abcToTest.method_2());

没有必要(或机会)在这里嘲笑

希望下面的代码对您有用

@Mock 
SampleClass sampleClass;

ReflectionTestUtils.setField(sampleClass, "variableName","ISO-8859-1");

为什么需要在模拟对象中为
int a
设置一个值?模拟对象不使用它拥有的任何实例变量。它的所有方法都不做任何事情,除了你告诉mock做什么。
int a的值与此无关。你想达到什么目标?我的小指告诉我你在试着模拟。那没用。你将要测试的是mockito的工作是否符合预期。是的,当mocks的概念被误解时,这种思维模式经常发生。mock是一个可编程存根,您可以使用它来代替被测代码与之对话的真实对象,这样它就不必与拉动整个世界的真实对象对话。这是一种隔离伤口的方法。所以,如果ABC是你的选择,你就不应该嘲笑那个班。对不起,说得不清楚。我想测试
方法2()
。这就是为什么我创建mock对象来为
方法\u 1()
赋值。我不知道如何处理
inta
的值。这是一种错误的测试方法吗?我是否应该先测试
其他对象
类,然后在构造函数中设置
ABC
类的值?在这种情况下,它将是一个单元测试吗?对不起,不清楚。我想测试方法_2()。这就是为什么我创建mock对象来为方法_1()赋值。我不知道如何处理int a的值。这是一种错误的测试方法吗?我应该先测试另一个对象类,然后在构造函数中设置ABC类的值吗?在这种情况下,它将是一个单元测试吗?如果您想测试方法_2(),那么您不能模拟类ABC。你不能创建一个假的ABC,如果你想测试真实的ABC,重点在哪里?你要测试的就是你的假ABC。所以,在你的情况下,你不需要嘲笑。只需创建一个新的ABC实例(
abctost=newabc(…);
)并进行测试。
@Mock 
SampleClass sampleClass;

ReflectionTestUtils.setField(sampleClass, "variableName","ISO-8859-1");