说,下面的类要测试:
public class MyClass {
public void method1() {
...
String str = method3()
...
}
public int method2() {...}
private String method3() {...}
}
我正在用JUnit编写MyClassTest.java
。我希望method3()
返回我分配的值,而不是执行方法本身。我只能使用Mockito。
有可能吗?
如果是,我该怎么办?
答案 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。