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 如何在单元测试中重写被测试类所调用的方法_Java_Unit Testing_Junit_Mocking_Easymock - Fatal编程技术网

Java 如何在单元测试中重写被测试类所调用的方法

Java 如何在单元测试中重写被测试类所调用的方法,java,unit-testing,junit,mocking,easymock,Java,Unit Testing,Junit,Mocking,Easymock,我正在测试一个类的函数func1 Func1有一个B类局部变量,并调用B的函数func2。代码如下所示: public Class A { public func1() { B object = new B(); int x = object.func2(something); } } 在单元测试中测试func1时,我不希望调用func2 所以我试着在测试中这样做: B textObject = new B() { @override

我正在测试一个类的函数func1

Func1有一个B类局部变量,并调用B的函数func2。代码如下所示:

public Class A
{
    public func1()
    {
       B object = new B();
       int x = object.func2(something);
    }
}
在单元测试中测试func1时,我不希望调用func2

所以我试着在测试中这样做:

B textObject = new B()
{
   @override
   int func2(something)
   {
      return 5;
   }
}

但它仍在调用类B中的func2。请建议如何处理此问题。

如果要重写
新的B()
构造函数调用,请将其放在自己的方法中

public Class A
{

    public func1()
    {
       B object = newB();
       int x = object.func2(something);
    }

    protected B newB(){
        return new B();
    }
}
在测试中,您可以覆盖
B
构造函数调用

public class APartitialMock extends A {

   protected B newB(){
      return new BMock();
   }
}

public class BMock extends B {

    int func2(something) {
        return 5
    }

}
然后使用
apartialmock
用您的
B
测试
func1

PS如果您可以或想要使用框架,请查看powermock-

我可以将B作为a中的类变量,但这似乎没有帮助 任何一个在这种情况下,你有什么建议

如果将B作为类变量,则可以模拟B,并在a的测试对象中“交换”它。
也许不是很优雅,但是又快又简单。

例如:

public class B {
    int func2(int something){
        return 3*something;
    }
}


还有一个测试:

import static org.mockito.Mockito.*;
import static org.junit.Assert.*;

import org.junit.Test;

public class ATest {

    @Test
    public void test() {
        A myA = new A();
        B myB = mock(B.class);

        // dummy function
        when(myB.func2(anyInt())).thenReturn(20);

        // replace B with mocked B
        myA.object = myB;

        int actual = myA.func1();

        assertEquals(20, actual);
    }
}

您是否可以使用依赖项注入、重构
A
B
作为参数,而不是在函数中创建一个
新的
参数?对于这样一个抽象的例子,很难给出合理的建议。我不能在A的构造函数中将B作为输入,也不能在func1中将B作为输入,因为我正在重写类A中的func1。我可以将B作为类A中的类变量,但这似乎也没有帮助。在这种情况下,你有什么建议?我不确定问题出在哪里;同样,这个例子太抽象了。做一些关于DI的研究。使用依赖注入解决了这个问题,谢谢你的帮助。在这种情况下,你可以写下来接受你自己的答案,而不是接受一个不是你真正解决问题的答案!我最终解决了这个抛出依赖注入,但这是一个伟大的建议!谢谢
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;

import org.junit.Test;

public class ATest {

    @Test
    public void test() {
        A myA = new A();
        B myB = mock(B.class);

        // dummy function
        when(myB.func2(anyInt())).thenReturn(20);

        // replace B with mocked B
        myA.object = myB;

        int actual = myA.func1();

        assertEquals(20, actual);
    }
}