Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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,我有一个Util.java类,它包含以下函数: public Util { UtilB b; funcA() { //someAction String a = b.someMethod(); funcB(); } funcB() { //recursive call to funcB funcC(); } funcC() { //some pro

我有一个Util.java类,它包含以下函数:

public Util {
    UtilB b;

    funcA() {
        //someAction
        String a = b.someMethod();
        funcB();
    }

    funcB() {
        //recursive call to funcB
        funcC();
    }

    funcC() {
        //some processing
    }
}
public UtilTest {

    @Mocks
    UtilB b;

    @InjectMocks
    Util test;

    @Test
    public funcA() {
        when(b.someMethod()).thenReturn("");
        test.funcA();
    }
}
在Mockito中编写测试用例时,我做了如下工作:

public Util {
    UtilB b;

    funcA() {
        //someAction
        String a = b.someMethod();
        funcB();
    }

    funcB() {
        //recursive call to funcB
        funcC();
    }

    funcC() {
        //some processing
    }
}
public UtilTest {

    @Mocks
    UtilB b;

    @InjectMocks
    Util test;

    @Test
    public funcA() {
        when(b.someMethod()).thenReturn("");
        test.funcA();
    }
}
如上所述,在调用funcA()时,我无法模拟对funcB()的调用。调用将进入funcB()内部。我可以在另一个类中移动
funcB()
,如
UtilB
中的
someMethod()
,并模拟该类,如
UtilB b
,测试将在不实际调用funcB()的情况下工作,但这是创建新类的好做法吗

此外,由于我正在测试类Util,所以将其设为间谍然后对其进行操作以模拟对funcB()的调用应该不好,对吗

既然
test,我是否应该首先模拟funcB()。funcA()
也将涵盖funcB()和funcC()


有人能告诉我在这种情况下什么是好的做法吗?

为什么在(test.funcB())时不能执行
?这是您真正的代码吗?否则,我怀疑这是一个XY问题,您可能希望尝试重构code@cricket_007
when(test.funcB())
将不起作用,因为
test
是一个真实实例,而不是模拟实例。我无法理解什么样的重构?我可以为funcB()创建一个新类,比如ClassB,用名称“ClassB”模拟它,然后
当(ClassB.funcB())
无法调用实际函数并按预期工作时。这正是我的问题,我们需要创建新类吗?每当我们遇到类似的场景时,我们都会继续创建新的类,这是一个好的实践吗?我需要查看您的真实代码,以说明您是否需要一个新的类。有时,您只有接口,而不仅仅是类。您可以按照TDD模式编写更好的测试代码,因为您对模拟的功能有错误的理解。mock替换依赖项,也就是说:不属于您的测试代码的类提供了它们自己的业务行为。您正在测试的类中的任何代码都是实现细节,不应进行模拟。