有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用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的结果。方法我试图提高class1的代码覆盖率,所以我需要调用它的实际生产方法

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


共 (3) 个答案

  1. # 1 楼答案

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

    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中的方法(或方法)获得的输出

  2. # 2 楼答案

    这对我很有效:

    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);
      }
    }
    
  3. # 3 楼答案

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

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

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

    类2和方法2()

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