使用 Mockito 在另一个 class 中模拟一个 class 方法
Using Mockito to mock a class method inside another class
我正在尝试使用 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 的间谍方法,但这会覆盖整个方法,而不是我想要的部分。
这对我有用:
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);
}
}
我想我理解你的问题。让我换句话说,你有一个你正在尝试测试的函数,并且想要模拟在该函数内调用的函数的结果,但在不同的 class 中。我已经通过以下方式处理了。
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 中的函数如何响应给定的特定输入。然后,在实际测试中,我只是在我想测试的 class 中调用我试图测试的函数。在这种情况下,myClass.functionCall() 是 运行 正常通过并且您没有覆盖它的任何方法,但您只是模拟它从 MyClass2 中的方法(或方法)获得的输出.
我写了一个简单的例子,效果很好,希望对你有帮助:
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());
}
}
我正在尝试使用 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 的间谍方法,但这会覆盖整个方法,而不是我想要的部分。
这对我有用:
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);
}
}
我想我理解你的问题。让我换句话说,你有一个你正在尝试测试的函数,并且想要模拟在该函数内调用的函数的结果,但在不同的 class 中。我已经通过以下方式处理了。
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 中的函数如何响应给定的特定输入。然后,在实际测试中,我只是在我想测试的 class 中调用我试图测试的函数。在这种情况下,myClass.functionCall() 是 运行 正常通过并且您没有覆盖它的任何方法,但您只是模拟它从 MyClass2 中的方法(或方法)获得的输出.
我写了一个简单的例子,效果很好,希望对你有帮助:
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());
}
}