有 Java 编程相关的问题?

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

java是否可以在JUnit中设置被测试类的方法的返回值?

比如说,有以下几类需要测试:

public class MyClass {
     public void method1() {
          ... 
          String str = method3()
          ...
     }
     public int method2() {...}
     private String method3() {...}
}

我在用JUnit写MyClassTest.java。我希望method3()返回我分配的值,而不是执行方法本身。我只能用Mockito

可能吗

如果是,我该怎么做


共 (2) 个答案

  1. # 1 楼答案

    仅使用Mockito无法模拟私有方法
    但是,您可以重构代码,将另一个类中的method3()提取为公共方法,作为MyClass的依赖项。这样method3()自然是可以嘲笑的

    public class MyClass {
    
         private Foo foo;
         public MyClass(Foo foo){
            this.foo = foo;
         }
         public void method1() {
              ... 
              String str = foo.method3()
              ...
         }
         public int method2() {...}
    }
    public class Foo {
         public String method3() {...}
    }
    

    现在在单元测试中模拟一下:

    @Mock
    Foo fooMock;
    MyClass myClass;
    
    @BeforeEach
    void init(){
        myClass = new MyClass(fooMock);
    }
    
    @Test
    public void method1(){
       Mockito.when(fooMock.method3()).thenReturn("dummy value");
       // call method1() 
       // do assertions
    }
    
  2. # 2 楼答案

    你不能用Mockito,但你可以用JMockit。您的测试如下所示:

    @RunWith(JMockit.class)
    public class JMockitTest {
    
        @Tested
        private MyClass myClass;
    
        @Before
        public void setUp(){
            myClass = new MyClass();
        }
    
        @Test
        public void testMethod1(){
    
            new MockUp<MyClass>() {
    
                @Mock
                String method3() {
                    return "dummy value";
                }
            };
    
            myClass.method1();
    
            // do assertions
        }
    }
    

    你可以阅读关于这个功能的文档,叫做faking,here