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

时间:2018-08-10 16:56:15

标签: java junit mockito

说,下面的类要测试:

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

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

有可能吗?

如果是,我该怎么办?

2 个答案:

答案 0 :(得分:3)

仅凭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
}

答案 1 :(得分: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
    }
}

您可以阅读有关此功能的文档,称为伪造here