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_Junit_Mocking_Mockito - Fatal编程技术网

Java 使用Mockito在另一个类中模拟类方法

Java 使用Mockito在另一个类中模拟类方法,java,unit-testing,junit,mocking,mockito,Java,Unit Testing,Junit,Mocking,Mockito,我正在尝试使用Mockito/JUnit为如下函数编写单元测试: class1 { method { object1 = class2.method // method that I want to fake the return value // some code that I still want to run } } 在Mockito中有没有办法存根class2.method的结果?我试图提高class1的代码覆盖率,所以我需要调用它的实际生产方法 我查看了MockitoA

我正在尝试使用Mockito/JUnit为如下函数编写单元测试:

class1 {
 method {
  object1 = class2.method // method that I want to fake the return value
  // some code that I still want to run
 }
}
在Mockito中有没有办法存根class2.method的结果?我试图提高class1的代码覆盖率,所以我需要调用它的实际生产方法


我查看了MockitoAPI的spy方法,但这会覆盖整个方法,而不是我想要的部分

这对我很有效:

public class Class1Test {

  Class1 class1;

  @Before
  public void setUp() {
    MockitoAnnotations.initMocks(this);
    class1 = new Class1();
  }

  @Test
  public void testClass1Method() {

    Class2 class2 = Mockito.mock(Class2.class);
    class1.setClass2(class2);
    Mockito.when(
            class2.class2Method(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn("some response");

    String actualResponse = class1
            .class1Method("12345", "3333", "4444");
    assertEquals("some response", actualResponse);
  }
}

我想我理解你的问题了。让我重新表述一下,您有一个函数,您正试图测试它,并且想要模拟在该函数中调用的函数的结果,但是在另一个类中。我用下面的方法处理了这个问题

public MyUnitTest {
    private static final MyClass2 class2 = mock(MyClass2.class);

    @Begin
    public void setupTests() {
        when(class2.get(1000)).thenReturn(new User(1000, "John"));
        when(class2.validateObject(anyObj()).thenReturn(true);
    }

    @Test
    public void testFunctionCall() {
        String out = myClass.functionCall();
        assertThat(out).isEqualTo("Output");
    }
}

这是在用@Before注释包装的函数中设置我希望class2中的函数如何响应给定的特定输入。然后,在实际测试中,我只是在我想要测试的类中调用我要测试的函数。在本例中,myClass.functionCall()正在正常运行,您没有覆盖它的任何方法,但您只是在模拟它从MyClass2中的方法(或方法)获得的输出。

我写了一个简单的示例,效果很好,希望有帮助:

来自Class1的method1()调用来自Class2的method2():

    public class Class1 {
        private Class2 class2 = new Class2();
        public int method1() {
            return class2.method2();
        }
    }
类2和方法2()

以及测试:

    import org.junit.Rule;
    import org.junit.Test;
    import org.mockito.InjectMocks;
    import org.mockito.Mock;
    import org.mockito.junit.MockitoJUnit;
    import org.mockito.junit.MockitoRule;

    import static org.junit.Assert.assertEquals;
    import static org.mockito.Mockito.when;

    public class TestClass1 {

        @Mock
        Class2 class2;

        @InjectMocks
        Class1 class1;

        @Rule
        public MockitoRule mockitoRule = MockitoJUnit.rule();

        @Test
        public void testMethod1(){
            when(class2.method2()).thenReturn(29);
            assertEquals(29,class1.method1());
        }
    }

这个答案是不完整的,实际上导致了某人犯了一个错误()。我看到了几个问题:1)变量/member
myClass
从未声明或初始化,class2也从未传递给它。2) 注释类
@Begin
不存在-它应该是
@BeforeClass
之前的注释类,或者可能是
@BeforeClass
3)成员类2可能不应该是静态的-特别是如果使用
@Before
之前的注释类。它应该为每个测试重新创建。4) 如果不是所有测试都需要,最好在测试本身中存根class2.class1.setClass2(class2);不确定这一行应该记录什么。setClass2(class2)正在发挥神奇的作用!它正在设置class1中的模拟对象。函数setClass2是否在某处定义?
    import org.junit.Rule;
    import org.junit.Test;
    import org.mockito.InjectMocks;
    import org.mockito.Mock;
    import org.mockito.junit.MockitoJUnit;
    import org.mockito.junit.MockitoRule;

    import static org.junit.Assert.assertEquals;
    import static org.mockito.Mockito.when;

    public class TestClass1 {

        @Mock
        Class2 class2;

        @InjectMocks
        Class1 class1;

        @Rule
        public MockitoRule mockitoRule = MockitoJUnit.rule();

        @Test
        public void testMethod1(){
            when(class2.method2()).thenReturn(29);
            assertEquals(29,class1.method1());
        }
    }