使用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的代码覆盖率,所以我需要调用它的实际生产方法。

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

我想我明白你的问题了。让我重新表述一下,你有一个想要测试的函数,并且想要模拟在该函数中调用的函数的结果,但是在不同的类中。我已按如下方式处理了
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中的方法(或方法)获得的输出。

这工作对我来说:

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);
  }
}

我写了一个简单的例子,工作得很好,希望它有帮助:

Class1中的method1()调用Class2中的method2():

    public class Class1 {
        private Class2 class2 = new Class2();
        public int method1() {
            return class2.method2();
        }
    }

Class2 and method2():

    public class Class2 {
        public int method2() {
            return 5;
        }
    }

和测试:

    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());
        }
    }

相关内容

  • 没有找到相关文章

最新更新